我需要显示一个对话框,无论用户屏幕锁定还是处于深度睡眠状态,该对话框都会显示。我目前的情况是:
-
广播接收器启动服务并获取WakeLock
PowerManagermgr=(PowerManager)context.getSystemService(context.POWER_SERVICE);lockStatic=mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUES_WAKEUP,LOCK_NAME_STATIC);
-
服务使用以下设置启动活动
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|WindowManager.LayoutParams.FLAG_TURN_SCREN_ON);
-
活动启动对话框片段
问题是,如果屏幕被锁定或处于睡眠状态,对话框就不会出现。即使屏幕关闭或锁定,Viber应用程序和Line messenger应用程序中的消息对话框也会弹出。他们是怎么做到的?
编辑
我发现当活动主题设置为theme.Holo.Light.NoActionBar.Fullscreen或任何Fullscreen主题时,它都有效。:)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
在我将活动主题更改为后,这些标志对我有效
Theme.Holo.Light.NoActionBar.Fullscreen
您应该使用KeyGuardManager自动解锁设备,然后获取唤醒锁。
KeyguardManager kgm = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
boolean isKeyguardUp = kgm.inKeyguardRestrictedInputMode();
KeyguardLock kgl = kgm.newKeyguardLock("Your Activity/Service name");
if(isKeyguardUp){
kgl.disableKeyguard();
isKeyguardUp = false;
}
wl.acquire(); //use your wake lock once keyguard is down.