5

I am using this code to detect when the screen gets locked and call a toast, it works every time the screen gets locked. However, whenever i go out of the app, it stops working. it only works if the app is open.

public class BatterySaverLiteReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            Log.i("Check", "Screen went OFF");
            Toast.makeText(context, "screen OFF", Toast.LENGTH_LONG).show();

            task(context);
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            Log.i("Check", "Screen went ON");
            Toast.makeText(context, "screen ON", Toast.LENGTH_LONG).show();
        }
    }

    private void task(Context context) {
        // Process Killer and display all package names in toast
        ActivityManager actvityManager = (ActivityManager) context
                .getApplicationContext().getSystemService(
                        context.getApplicationContext().ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> procInfos = actvityManager
                .getRunningAppProcesses();
        for (int pnum = 0; pnum < procInfos.size(); pnum++) {
            actvityManager
                    .killBackgroundProcesses(procInfos.get(pnum).processName);
        }
    }
}

thats how im registering my receiver

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

manifest

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

i got this code from here

Community
  • 1
  • 1
MaggotSauceYumYum
  • 402
  • 1
  • 5
  • 23
  • is it because unregisterReceiver your broadcastreceiver in onPause, onStop or onDestory method? – xxxzhi Jan 21 '16 at 13:41

3 Answers3

1

I think you are killing all the processes including your process in task() method. Filter out your background service's process from killBackgroundProcesses().

Get the process name from RunningAppProcessInfo and compare it with your apps's process name. By default, process name will be equal to package name.

private void task(Context context) {
    ActivityManager actvityManager = (ActivityManager) context
            .getApplicationContext().getSystemService(
                    context.getApplicationContext().ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> procInfos = actvityManager
            .getRunningAppProcesses();
    for (int pnum = 0; pnum < procInfos.size(); pnum++) {
        ActivityManager.RunningAppProcessInfo info = procInfos.get(pnum);

        if (info.pid != android.os.Process.myPid()) {
            actvityManager.killBackgroundProcesses(info.processName);
        }
    }
}
Msp
  • 2,493
  • 2
  • 20
  • 34
  • Filtering own package name is not useless. It can kill it's own process. Read the answer [here](http://stackoverflow.com/a/25508685/1542531). – Msp Dec 31 '15 at 16:25
  • Make sure that your process name and package name are same. – Msp Dec 31 '15 at 16:32
0

Use WakefulBroadcastReceiver instead of BroadcastReceiver

http://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

Arfan Mirza
  • 668
  • 1
  • 14
  • 24
-1

I found a more efficient and reliable solution, i registered a notificationmanager which works every 5 seconds and calls the method in my main activity!

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ENABLE MyReceiver SERVICE
        ComponentName receiver = new ComponentName(MainActivity.this,
                NotifyService.class);
        PackageManager pm = this.getPackageManager();
        pm.setComponentEnabledSetting(receiver,
                PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
                PackageManager.DONT_KILL_APP);
        // Toast.makeText(this, "Enabled broadcast receiver",
        // Toast.LENGTH_SHORT)
        // .show();
        // --//

        Intent intent = new Intent(this, NotifyService.class);
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);

        AlarmManager am = (AlarmManager) this
                .getSystemService(Context.ALARM_SERVICE);
        long recurring = (1 * 1000 * 5); // in milliseconds
        am.setRepeating(AlarmManager.RTC, Calendar.getInstance()
                .getTimeInMillis(), recurring, sender);
    }

    public static void mehtodName(Context context) {
        KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
           if( myKM.inKeyguardRestrictedInputMode() ) {
                // it is locked
               task(context);
           } else {
                //it is not locked
           }
    }

     private static void task(Context context) {
            // Process Killer and display all package names in toast
            ActivityManager actvityManager = (ActivityManager) context
                    .getApplicationContext().getSystemService(
                            context.getApplicationContext().ACTIVITY_SERVICE);
            List<RunningAppProcessInfo> procInfos = actvityManager
                    .getRunningAppProcesses();
            for (int pnum = 0; pnum < procInfos.size(); pnum++) {
                actvityManager
                        .killBackgroundProcesses(procInfos.get(pnum).processName);
            }
        }
    }

NotifyService.java

public class NotifyService extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        MainActivity.mehtodName(context);
        // ... do what you need to do here...
    }

}

My Manifest

 <receiver android:name="com.example.notifypro.NotifyService" >
 </receiver>
MaggotSauceYumYum
  • 402
  • 1
  • 5
  • 23