我想要一個android應用程序小部件來定期更新。我使用了Handler
來達到這個目的,因爲我希望它更頻繁地更新(一分鐘一次)。在onEnabled()
上聲明Handler
的調用按預期工作。但有時會失敗。該小部件不升級,並通過日誌記錄,我發現Handler
成爲null
。所以我宣佈Service
來更新小部件並宣佈Handler
並用它更新。現在我所有的小部件都是在onEnabled()
呼叫中啓動服務,並在onDisabled()
呼叫上停止它。 Service
始終運行並更新小部件。代碼:使用服務處理程序更新應用程序小部件
public void onCreate() {
super.onCreate();
handler=new Handler();
runnable=new Runnable() {
@Override
public void run() {
ComponentName appWidget=new ComponentName(getApplicationContext().getPackageName(),widget.class.getName());
AppWidgetManager widgetManager= AppWidgetManager.getInstance(getApplicationContext());
int ids[]=widgetManager.getAppWidgetIds(appWidget);
for(int id:ids)
{
RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widgetLayout);
//Update Widget here
widgetManager.updateAppWidget(id, views);
}
handler.postDelayed(runnable, delay);
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.post(runnable);
return super.onStartCommand(intent, flags, startId);
}
這是更新窗口小部件的最佳方法嗎?因爲這意味着用戶可以使用任務殺手來終止該服務,這將導致該小部件無法正常工作,並且如果該設備重新啓動,則該服務將不會運行。那麼如何擺脫這個並更新小部件?還是有一種更有效的方式來非常頻繁且可靠地更新小部件?謝謝。
感謝您的回答。我已經嘗試使用小部件中的'AlarmManager'。它的工作,但它也有時失敗,我的小部件被凍結。這就是爲什麼我使用Handler。 –
只要對AlarmManager進行調用,我認爲不會有太大的區別。我很驚訝地聽到它有時會失敗 – 0xDEADC0DE
是的。有時候我會看到這個小部件剛剛被凍結而沒有更新。即使當我使用處理程序從小部件內部進行更新時,也會發生這種情況。當我手動觸發配置活動的更新時,該更新將起作用。但不能與AlarmManager或處理程序。 –