1

我有一个更新 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() 中清理会更好吗?

4

1 回答 1

4

永远不要在 中注册监听IntentService器,就像从不在 manifest-registered 中注册监听器一样BroadcastReceiver。这些应该是短暂的物体。您的听众将您的已失效记忆保留IntentService在内存中,并在此过程中泄漏内存。

当最后一个小部件被删除时,让服务一直运行并在 onDestroy() 中清理会更好吗?

当应用程序一直保持服务运行时,用户会非常恼火,除非他们清楚地了解其好处。我会避免这种情况。

于 2010-08-26T12:41:22.247 回答