如何在锁定的屏幕上显示对话框,如viber或Line messenger



我需要显示一个对话框,无论用户屏幕锁定还是处于深度睡眠状态,该对话框都会显示。我目前的情况是:

  1. 广播接收器启动服务并获取WakeLock

    PowerManagermgr=(PowerManager)context.getSystemService(context.POWER_SERVICE);lockStatic=mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUES_WAKEUP,LOCK_NAME_STATIC);

  2. 服务使用以下设置启动活动

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

  3. 活动启动对话框片段

问题是,如果屏幕被锁定或处于睡眠状态,对话框就不会出现。即使屏幕关闭或锁定,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.

最新更新