Search code examples
androidandroid-broadcastandroid-windowmanager

Android listen to Lock screen displayed


I want to do a method when lock screen displayed (not when unlocked or screen on, just when lock screen displayed). i try with broadcast and services but they don't work after killing app. Also In eclips LogCat i see a log like /WindowManager(473): Lock screen displayed! that genymotion produce . maybe can be done with windowmanager..


Solution

  • I found it. using service and set it START_STICKY. after killing service the service restart again. it is my code :

    android manifest : 
    <application 
    ....
        <service android:name=".UpdateService" />
    
     </application>
    

    service class :

    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.util.Log;
    import android.widget.Toast;
    
    
    public class UpdateService extends Service {
    
        BroadcastReceiver mReceiver;
    
    
        @Override
        public void onCreate() {
            super.onCreate();
            // register receiver that handles screen on and screen off logic
            IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            mReceiver = new MyReceiver();
            registerReceiver(mReceiver, filter);
        }
    
    
        @Override
        public void onDestroy() {
    
            unregisterReceiver(mReceiver);
            Log.i("onDestroy Reciever", "Called");
    
            super.onDestroy();
        }
    
    
        @Override
        public void onStart(Intent intent, int startId) {
            boolean screenOn = intent.getBooleanExtra("screen_state", false);
            if ( !screenOn) {
                Log.i("screenON", "Called");
                Toast.makeText(getApplicationContext(), "Awake", Toast.LENGTH_LONG)
                        .show();
            } else {
                Log.i("screenOFF", "Called");
                Toast.makeText(getApplicationContext(), "Sleep",
                        Toast.LENGTH_LONG)
                        .show();
            }
        }
    
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
        }
    
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return Service.START_STICKY;
        }
    }
    

    receiver class :

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    
    public class MyReceiver extends BroadcastReceiver {
    
        private boolean screenOff;
    
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
    
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                screenOff = true;
                Log.i("screenLog", "screen off");
    
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                screenOff = false;
                Log.i("screenLog", "screen on");
            }
    
    
        }
    }
    

    in StartupActivity :

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
    
            Context context = getApplicationContext();
            Intent service = new Intent(context, UpdateService.class);
            context.startService(service);
    }