Сохранять широковещательный приемник после закрытия приложения

Мне нужно поддерживать широковещательный приемник все время после запуска приложения.

Вот код, который регистрирует этот приемник в приложении

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); filter.addAction(Intent.ACTION_SCREEN_OFF); BroadcastReceiver mReceiver = new ScreenEventsReceiver(); registerReceiver(mReceiver, filter); 

И код для приемника

 public class ScreenEventsReceiver extends BroadcastReceiver { public static boolean wasScreenOn = true; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { wasScreenOn = false; Log.d("ScreenEventReceiver", "ON"); } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { wasScreenOn = true; Log.d("ScreenEventReceiver", "ON"); } } } 

Solutions Collecting From Web of "Сохранять широковещательный приемник после закрытия приложения"

Вы можете воспользоваться услугой

В главном приложении запуск / остановка службы

 Intent service = new Intent(context, MyService.class); context.startService(service); ... Intent service = new Intent(context, MyService.class); context.stopService(service); 

оказание услуг

 public class MyService extends Service { private static BroadcastReceiver m_ScreenOffReceiver; @Override public IBinder onBind(Intent arg0) { return null; } @Override public void onCreate() { registerScreenOffReceiver(); } @Override public void onDestroy() { unregisterReceiver(m_ScreenOffReceiver); m_ScreenOffReceiver = null; } private void registerScreenOffReceiver() { m_ScreenOffReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(TAG, "ACTION_SCREEN_OFF"); // do something, eg send Intent to main app } }; IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF); registerReceiver(m_ScreenOffReceiver, filter); } } 

Если вы объявите BroadcastReceiver в манифесте, он всегда будет активным и будет вызван, даже если приложение закрыто / остановлено

Вы можете запустить службу, которая работает на переднем плане. Это единственный способ гарантировать (в основном), что ваше приложение получит события. По-прежнему существует вероятность того, что ваша служба переднего плана может быть убита во время сумасшедшего давления памяти из ОС (так что она не является надежной). Если вы запустите службу на переднем плане, пользователь увидит постоянное уведомление, чтобы знать, что он всегда работает.

Итак, мораль этой истории, действительно ли вам нужно постоянно следить за экранами / событиями? Причина, по которой они заставляют вас регистрировать приемник не в манифесте, заключается в том, что они не хотят, чтобы люди всегда следили за этими событиями и замедляли работу устройства. Что вы пытаетесь достичь?

Будьте осторожны, если вы используете Android 4.4.x, так как есть ошибка, которая убивает фоновые службы при закрытии приложения. Я тестировал свое приложение в Android 4.4.2, и у меня была такая же проблема. Здесь есть подробное объяснение:

http://www.androidpolice.com/2014/03/07/bug-watch-stopping-apps-on-android-4-4-2-can-silently-kill-related-background-services-a-fix- в пути/