Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onReceive works only once android

Tags:

android

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

like image 388
MaggotSauceYumYum Avatar asked Nov 21 '22 18:11

MaggotSauceYumYum


1 Answers

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);
        }
    }
}
like image 155
Msp Avatar answered Nov 23 '22 08:11

Msp