onReceive只能运行一次android

时间:2015-12-31 15:16:30

标签: android

我正在使用此代码来检测屏幕何时被锁定并调用吐司,每次屏幕锁定时它都能正常工作。但是,每当我退出应用程序时,它就会停止工作。它只适用于应用程序打开的情况。

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);
        }
    }
}

这就是我如何注册我的接收器

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

清单

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

我从here

获得了此代码

3 个答案:

答案 0 :(得分:1)

我认为您正在使用task()方法杀死所有进程,包括您的进程。从killBackgroundProcesses()过滤掉后台服务的流程。

RunningAppProcessInfo获取流程名称,并将其与您应用的流程名称进行比较。默认情况下,进程名称将等于包名称。

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 :(得分:0)

答案 2 :(得分:-1)

我找到了一个更有效,更可靠的解决方案,我注册了一个通知管理器,每5秒工作一次并在我的主要活动中调用该方法!

<强> 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...
    }

}

我的清单

 <receiver android:name="com.example.notifypro.NotifyService" >
 </receiver>