在我的应用程序中有一个广播接收器,它在特定时间由带有 RTC_WAKEUP 的警报调用。此接收器首先获取部分锁定,因此它不会终止,然后检查条件,如果为真,则启动一个活动,通过获取完整锁定和解锁键盘保护来完全打开手机。
经过一些测试和试验,我发现广播接收器的生命周期在开始活动之前就结束了,并且一旦结束,部分锁定就会被释放。
所以我想知道设备是否处于睡眠状态,活动是否会启动以便获得完全锁定?
或者一旦广播接收器结束,设备就会重新进入睡眠状态,并且活动的开始被推迟到它再次醒来的时候?
在我的应用程序中有一个广播接收器,它在特定时间由带有 RTC_WAKEUP 的警报调用。此接收器首先获取部分锁定,因此它不会终止,然后检查条件,如果为真,则启动一个活动,通过获取完整锁定和解锁键盘保护来完全打开手机。
经过一些测试和试验,我发现广播接收器的生命周期在开始活动之前就结束了,并且一旦结束,部分锁定就会被释放。
所以我想知道设备是否处于睡眠状态,活动是否会启动以便获得完全锁定?
或者一旦广播接收器结束,设备就会重新进入睡眠状态,并且活动的开始被推迟到它再次醒来的时候?
如果要在 BroadcastReceiver 中启动 Activity,请不要忘记添加标志:FLAG_ACTIVITY_NEW_TASK
public void onReceive(Context context, Intent i) {
if (check condition) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClass(context,THE_ACTIVTY_YOU_WANT_TO_START.class);
context.startActivity(intent);
}
}
使用 FULL_WAKE_LOCK 强制打开屏幕,在 onCreate() 方法中添加以下代码即可。
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
kl = km.newKeyguardLock("info");
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "info");
kl.disableKeyguard();
在浏览 GCM 手册时,我发现了以下章节:
http://developer.android.com/google/gcm/gcm.html#handling_intents
我认为您必须在仍然处于 BroadcastReceiver#onReceive 的同时获得 WakeLock。他们在 IntentService 中使用静态 WakeLock。