Жизненный цикл сервиса и лучший способ отменить регистрацию слушателей

У меня есть 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() после удаления последнего виджета?

1 ответ

Решение

Никогда не регистрируйте слушателя в IntentServiceтак же, как вы никогда не регистрируете слушателя в манифесте BroadcastReceiver, Предполагается, что это недолговечные объекты. Ваши слушатели сохраняют вашу несуществующую IntentService в памяти и утечка памяти по пути.

Было бы лучше, чтобы служба все время работала и очищалась в onDestroy() после удаления последнего виджета?

Пользователи очень раздражаются, когда приложения постоянно поддерживают работу служб, если они не понимают преимущества. Я бы избежал этого.

Другие вопросы по тегам