AppWidgetを更新するIntentServiceがあります。このサービスは、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()でクリーンアップする方がよいでしょうか?