Как решаются намерения, когда служба остановлена?
Я новичок в программировании 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);
}
а также не забудьте отменить регистрацию, когда ваша служба будет остановлена