Как решаются намерения, когда служба остановлена?

Я новичок в программировании Android, так что это, вероятно, глупые вопросы. Я немного прочитал, но не могу получить ответ.

У меня есть приемник вещания с некоторыми намерениями, зарегистрированными в службе -

    receiver = new EventHandler();
    IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); // for calls
    registerReceiver(receiver, filter);

Когда я удалил вызов setForeground, который я вставил, чтобы сохранить работу моего сервиса (так как мне не нужен значок в строке состояния, и мне интересно, ленив ли я при таком подходе), мой сервис теперь получит регулярно убивали и снова заводили, как правило, через некоторое время (но иногда я видел, что это было 5 минут).

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

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

Благодарю.

3 ответа

Решение

Хорошо, во-первых, если вы хотите сохранить свой сервис, вы должны приобрести WakeLock от PowerManager в onCreate() и выпустить его в onDestroy(),

http://developer.android.com/reference/android/os/PowerManager.html

Иногда ОС все еще может разрушать и воссоздавать ваш сервис, но вам не нужно беспокоиться о том, что он будет остановлен на длительный период. (startForeground() также не гарантирует, что ваш Service останется в живых после того, как вы применили блокировку клавиатуры, например.)

Если ваш сервис уничтожен, то ОС все равно будет запускать Intents ты просто не увидишь их.

Intent - это специальный механизм позднего связывания в Android. Приемники широковещания, действия и службы регистрируют там фильтры намерений в системе, и когда срабатывает намерение, система активирует компоненты, которые могут обработать это намерение. Таким образом, если в системе зарегистрирован фильтр намерений, будет вызван ваш компонент. В случае статических намеренных фильтров в системе (тех, которые объявлены в AndroidManifest.xml) ОС Android регистрируется тогда во время запуска системы. В случае динамических фильтров намерений (которые объявлены в коде для вещательных приемников) вам необходимо зарегистрировать их после загрузки. Таким образом, вы можете объявить intent-filter для события onBoot и в этом широковещательном приемнике вы можете объявить свои динамические намерения.

О том, что ваш сервис убит и перезапущен, это нормально для Android, особенно когда памяти недостаточно. ACTION_BATTERY_CHANGED не может быть помещен в манифест, но ACTION_SCREEN_ON/OFF может. Итак, вы поместили в службу и убедитесь, что ваш приемник событий работает, поместите регистр в метод onCreate():

public void onCreate() {
    super.onCreate();

    // battery
    registerReceiver(mBatteryInfoReceiver, new IntentFilter(
        Intent.ACTION_BATTERY_CHANGED));
    ...
}

public void onDestroy() {
    super.onDestroy();

    unregisterReceiver(mBatteryInfoReceiver);
}

а также не забудьте отменить регистрацию, когда ваша служба будет остановлена

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