Search code examples
androidbroadcastreceiverscreen-lock

How to launch an app when the screen unlocks?


I have tried this code but it's not working. Does anybody have any different solution? I have tried many ways like the below one from Stack Overflow but none of them is working.

manifest.xml

 <receiver android:name=".ScreenReceiver">
 <intent-filter>
 <action android:name="android.intent.action.SCREEN_OFF"/>
 <action android:name="android.intent.action.SCREEN_ON"/>
 </intent-filter>
 </receiver>

screenreceiver

  public class ScreenReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
         if (intent.getAction().equals(Intent.ACTION_SCREEN_ON))
         {
            Intent intent = new Intent();  
            intent.setClass(context, ScreenLockActivity.class);
            startActivity(intent);          
         }
    }
}

Solution

  • To listen to screen on/off, your app should run by time and register Broadcast receiver to OS programmatically.

    ScreenOnOffService.java

    public class ScreenOnOffService extends Service {
    
        public IBinder onBind(Intent intent) {
            return null;
        }
    
        public void onCreate() {
            super.onCreate();
            Log.i("ScreenOnOffService", "onCreate: ");
            IntentFilter intentFilter = new IntentFilter();
    //        intentFilter.addAction("android.intent.action.SCREEN_OFF");
            intentFilter.addAction("android.intent.action.SCREEN_ON");
            registerReceiver(ScreenOnReceiver.newInstance(), intentFilter);
        }
    
        public void onDestroy() {
            super.onDestroy();
            Log.i("ScreenOnOffService", "onDestroy: ");
            unregisterReceiver(ScreenOnReceiver.newInstance());
    //        startService(new Intent(this,ScreenOnOffService.class));
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return Service.START_STICKY;
        }
    
    }
    

    ScreenOnReceiver.java

    public class ScreenOnReceiver extends BroadcastReceiver {
    
        public static final String TAG = "ScreenOn";
        public static volatile ScreenOnReceiver screenOn;
    
        public static ScreenOnReceiver newInstance() {
            if (screenOn == null) {
                screenOn = new ScreenOnReceiver();
            }
            return screenOn;
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i("hieuN", "intent: " + intent.getAction());
            // do work. start activity.
    
        }
    }
    

    Start service in activity

    Intent service = new Intent(this, ScreenOnOffService.class);
    startService(service);