我正在使用此代码来检测屏幕何时被锁定并调用吐司,每次屏幕锁定时它都能正常工作。但是,每当我退出应用程序时,它就会停止工作。它只适用于应用程序打开的情况。
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
获得了此代码答案 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)
使用WakefulBroadcastReceiver而不是BroadcastReceiver
http://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html
答案 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>