Остановить службу, когда приложение переходит в фоновый режим, используя обычное базовое действие

У меня есть класс Base Activity для реализации общего поведения для всех Activity. Все они расширяют эту BaseActivity.

Я привязываюсь к службе в методе onStart BaseActivity и отменяю привязку условно в методе onStop. Условно я имею в виду, что в зависимости от некоторого параметра, выбранного пользователем, служба должна или не должна работать в фоновом режиме, когда приложение переходит в фоновый режим.

Проблема в том, что иногда служба продолжает работать, хотя не должна (это когда опция для ее уничтожения включена и фактически вызывается unbindService ()).

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

Кроме того, в документации кое-что говорится об этом:

Обычно вы должны сочетать привязку и отмену привязки во время сопоставления моментов включения и отключения в жизненном цикле клиента. Например:

Если вам нужно взаимодействовать со службой только тогда, когда ваша активность видна, вам следует выполнить привязку во время onStart () и отменить привязку во время onStop ().

Если вы хотите, чтобы ваша активность получала ответы, даже когда она остановлена ​​в фоновом режиме, вы можете выполнить привязку во время onCreate () и отменить привязку во время onDestroy (). Помните, что это означает, что ваша деятельность должна использовать службу все время, пока она работает (даже в фоновом режиме), поэтому, если служба находится в другом процессе, вы увеличиваете вес процесса, и становится более вероятным, что система будет убей это.

Поскольку я как бы пытаюсь реализовать оба варианта, как лучше всего реализовать это?


person Esparver    schedule 25.04.2013    source источник
comment
Взгляните на мой ответ на этот вопрос Я думаю, что это лучший подход, чем постоянная привязка / отключение   -  person David Wasser    schedule 25.04.2013
comment
Мой ответ неверен, пожалуйста, снимите флажок, чтобы я мог его удалить.   -  person Hoan Nguyen    schedule 26.04.2013


Ответы (1)


В конце концов я изменил свой подход и решил использовать только startService() и связываться со службой с помощью локального широковещательного приемника.

Я запускаю службу в onCreate() и останавливаю ее в onDestroy() методах Базового действия. Затем, чтобы отправить сообщение от Сервиса к действию, я использую это:

private void sendBroadcastMessage(String msg) {
    Log.d(LOG_TAG, "send broadcast message: " + msg);
    Intent intent = new Intent(MyService.class.getSimpleName());
    // Add data
    intent.putExtra("message", msg);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

Затем, чтобы получать уведомления в действии:

// handler for the events launched by the service
private BroadcastReceiver mMyServiceReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Extract data included in the Intent
        String message = intent.getStringExtra("message");
        Log.d(LOG_TAG, "Got message: " + message);
        // Do stuff...
    }
};

И чтобы зарегистрировать Получателя в активности:

@Override
public void onResume() {
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMonitorReceiver,
          new IntentFilter(MyService.class.getSimpleName()));
}
person Esparver    schedule 29.04.2013