如何创建在锁定屏幕顶部可见的活动

Rus*_*ell 11 android locking wakeup

屏幕锁定时,我收到了传入的C2DM通知.我想唤醒屏幕并使用活动在锁定屏幕顶部显示通知消息.我正在从我的C2DM BroadcastReceiver启动通知活动,如下所示:

Intent new_intent= new Intent().setClass( context, EIAlertDialog.class );           
new_intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );      
new_intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );      
context.startActivity( new_intent );
Run Code Online (Sandbox Code Playgroud)

在通知Activity的onCreate方法中,我按如下方式唤醒屏幕:

PowerManager powerManager= (PowerManager)getSystemService( Context.POWER_SERVICE );
if (!powerManager.isScreenOn()) {
    mWakeLock= powerManager.newWakeLock(
                   PowerManager.FULL_WAKE_LOCK |
                   PowerManager.ACQUIRE_CAUSES_WAKEUP, 
                   "My Tag" )
    mWakeLock.acquire();
}
Run Code Online (Sandbox Code Playgroud)

屏幕被唤醒,但在我解锁屏幕之前,通知活动不可见.

我意识到我可以使用下面的代码来避开锁定屏幕,但这是不可取的.我希望用户解锁手机,只要他/她有兴趣阅读/回复通知.

getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
);
Run Code Online (Sandbox Code Playgroud)

hac*_*bod 0

使用标志是正确的方法,使用电源管理器是错误的。

您的请求对我来说听起来很矛盾:您说您希望活动显示在锁定屏幕的顶部(事实上我们不这样做,我们隐藏锁定屏幕以便可以看到活动),而同时您希望用户首先必须解锁设备。

如果您认为希望用户在解锁设备以查看您的活动之前看到通知...我真的认为您不希望这样。该通知非常小(在顶部的状态栏中),并且发布时显示的下一个通知非常短暂。对于那些听到手机发出嘟嘟声或嗡嗡声并拿出手机查看发生了什么情况的人来说,这不会是一个好的体验。

您应该使用对您的应用程序有意义的窗口标志的任何组合。您可以在它们的各种组合之间获得几乎任何合理的行为。这些用于闹钟、来电 UI 等。