Search code examples
javaandroidbroadcastreceiver

Keep broadcast receiver running after application is closed


I need to keep broadcast receiver running all the time after app has been started.

Here is the code that registers this receiver in the application

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

And code for receiver

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");
        }
     }
}

Solution

  • You can use a service

    In main app start/stop the service

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

    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, e.g. send Intent to main app
       }
      };
      IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
      registerReceiver(m_ScreenOffReceiver, filter);
     }
    }