2010-12-12 84 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