我有一个更新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()中清理会不会更好?
答案 0 :(得分:4)
永远不要在IntentService
中注册一个监听器,就像从未在清单注册的BroadcastReceiver
中注册监听器一样。这些应该是短命的物体。你的听众正在将你已经不存在的IntentService
留在记忆中,并在此过程中泄漏记忆。
让服务更好吗? 一直运行并清理干净 最后一个小部件时的onDestroy() 去掉?
当应用程序始终保持服务运行时,用户会非常恼火,除非他们清楚地了解这些好处。我会避免这种情况。