OnReceive only works once.

I use this code to detect a screen lock and call a toast, it works every time the screen locks. However, when I exit the application, it stops working. it only works if the application 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); } } } 

This is how I register 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 here

+5
source share
3 answers

I think that you kill all processes, including your process, in the task() method. Filter your background service with killBackgroundProcesses() .

Get the process name from RunningAppProcessInfo and compare it with the process name of your application. By default, the process name will be equal to the 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); } } } 
+1
source
0
source

I found a more efficient and reliable solution, I registered a notification manager that works every 5 seconds and calls the method in my main action!

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> 
-1
source

Source: https://habr.com/ru/post/1239583/


All Articles