1
我有一個IntentService更新AppWidget。每次將AppWidget放置在屏幕上或調用AlarmManager/ContentObserver/OnChangeListener時,該服務都會啓動。它在更新小部件後自行停止。當沒有插件更新服務的生命週期以及註銷聽衆的最佳方式
UpdateService.java:
@Override
public void onCreate() {
contentObserver = new CustomContentObserver();
registerContentObserver(contentObserver);
/* Am I registering several instances here or is this fine? */
onChangeListener = new CustomSharedPreferencesOnChangeListener();
sharedPreferences.registerOnSharedPreferenceChangeListener(onChangeListener);
Intent updateIntent = new Intent(this, UpdateService.class);
pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0);
alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
}
@Override
public void onStart(Intent intent, int startId) {
if(AppWidget.DISABLE.equals(intent.getAction())) {
unregisterContentObserver(contentObserver);
sharedPreferences.unregisterOnSharedPreferenceChangeListener(onChangeListener);
alarmManager.cancel(pendingIntent);
} else {
/* Scheduling next update */
alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTime, pendingIntent);
/* Updating the Widget ... */
updateWidget();
/* Stopping the Service */
stopSelf();
}
}
服務應該無法啓動,所以我必須註銷監聽器和觀察者和取消掛起的意圖。
我想知道最好的方法是清理資源?啓動服務來阻止它對我來說似乎有點尷尬。
AppWidget.java:
@Override
public void onDisabled(Context context) {
Intent intent = new Intent(context, UpdateService.class);
intent.setAction(DISABLE);
context.startService(intent);
context.stopService(intent);
super.onDisabled(context);
}
我也想知道啓動和停止服務的成本。當最後一個部件被移除時,讓服務始終運行並在onDestroy()中清理會更好嗎?
感謝您的快速響應。那麼,當PreferenceScreen打開時,每次更改首選項時發送updateIntent,註冊ChangeListener會更好嗎? 你會在哪裏註冊ContentObserver? – Konrd 2010-08-26 13:33:52
@konradf:「當PreferenceScreen每次改變首選項時打開發送updateIntent,註冊ChangeListener會更好嗎?」 - 這應該工作AFAIK。 「你在哪裏註冊ContentObserver?」 - 我不會。這對你沒有任何好處。根據你的計時器更新小部件 - 你不需要一個「ContentObserver」。如果你願意,可以更新你想要觀察的內容。 – CommonsWare 2010-08-26 22:49:16
@CommonsWare那麼如果不在後臺服務中,管理後臺觀察者的最佳方式是什麼?只要系統還活着,我就希望觀察者活着。 – Olayinka 2015-04-16 20:20:42