2010-12-12 117 views
8

我有一个简单的appwidget,我想在活动中发生操作(在同一应用程序中)时更新它。在onUpdate()中,我立即更新了小部件,它工作正常。在我的活动中,我调用了在onUpdate()中调用的appwidget中的静态更新方法来更新视图。该小部件未更新。android appwidget不会从活动更新

我可以将代码直接追踪到AppWidgetManager.updateAppWidget()方法中,这一切都很好,但小部件不会更新。

我能看到的唯一可能的区别是,当从活动的上下文与appwidget的onUpdate()方法的上下文调用它时,传递到我的静态更新方法中的上下文对象是不同的。然而,在网络上有很多例子,所以我希望它能起作用。

回答

19

没有看到你的代码我不是100%确定你是怎么做到的,但是这里是我使用的方法。在我的Activity我有以下方法:

private void updateAllWidgets(){ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext()); 
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class)); 
    if (appWidgetIds.length > 0) { 
     new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds); 
    } 
} 

哪里MyWidget是班上appwidget的。我可以从我的Activity内的任何地方调用此方法来更新我的所有应用程序。

+1

的接收器标签内,所以问题一定是,我是不是更新正确的ID。实际上,小部件设置了一个onclick意图,其id由活动接收,然后告知小部件自行更新。 – 2010-12-14 19:13:21

+0

我不认为调用onUpdate方法是正确的方法。您应该为AppWidgetManager.ACTION_APPWIDGET_UPDATE发送广播。 – midhunhk 2014-06-30 09:36:08

+0

@silverback从“正确地做到”的方法,我同意你的观点,正确的做法是发送广播。从“使其工作”的方法,上述将导致应用程序小部件更新 - 脏,但功能。 – 2014-06-30 10:26:10

9

不是使用静态方法,而是利用widget已经是广播接收器的事实,并在清单中注册更新意图。然后,当你需要从活动更新,它只是调用

//in your activity 
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever)); 



//In widget class 
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET"; 

,这让事情的工作清单文件

<intent-filter> 
    <action android:name="com.example.UPDATE_MY_WIDGET"/> 
</intent-filter> 
+0

我正在这样做,但我改变它,所以小部件只是开始一个意图服务。为什么?该小部件执行潜在的长时间运行操作。当onUpdate()没有及时返回时,我正在获取ANR。不知道这是否与我的问题有关。 – 2010-12-14 19:11:27

+0

是的,任何长操作都应该使用IntentService,AsyncTask或其他类型的线程。我的答案是我将如何去通知您的小部件它的时间来启动任务 - 或 - 通知您的小部件,该任务已完成并需要更新其状态。 – schwiz 2010-12-14 19:19:04

+0

@schwiz很久以前,但仍然应该在onUpdate()中启动一个服务来执行长操作。我认为接收器需要5秒钟才能执行。创建一个AsyncTask是不够的,因为它也会在接收器被破坏时被杀死。 – HGPB 2013-02-19 13:45:10