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

时间:2011-02-15 21:17:24

标签: 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 );

并在通知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();
}

屏幕被唤醒,但直到我解锁屏幕才会看到通知活动。

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

getWindow().addFlags(
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON 
);

3 个答案:

答案 0 :(得分:2)

据我所知,这是不可能的。听起来您正在尝试复制iOS体验。你应该意识到android有自己的约定,违反它们不是你应该做的事情。

Android有点矛盾。它是非常开放的,作为一个开发者,你可以访问任何东西,并且由你来决定使用这些权力的好坏。当我说邪恶时,我不是指恶意软件。我的意思是试图变得可爱并且以不应该使用的方式使用事物的应用程序,比如提出要求您更多地使用应用程序的通知。矛盾的是你实际上并没有访问所有内容,开发人员认为有一些部分非常重要,以至于应用程序无法解决它们。锁屏是这些部件之一。您可以随意更换家庭应用程序,但您永远不必担心更换锁定屏幕失败并阻止您访问手机。

即使这是可能的,你也会遇到更多问题。每个锁定屏幕都不同,制造商可以自定义它,因此您无法保证您的活动不会妨碍解锁手机。

答案 1 :(得分:0)

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

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

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

您应该使用对您的应用有意义的窗口标记的任意组合。你可以在它们的各种组合之间获得几乎任何合理的行为。这些用于闹钟,来电用户界面等

答案 2 :(得分:0)

在您的活动中尝试此操作

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

    boolean screenOn = pm.isScreenOn();//check id screen is on

    if(!screenOn){//if not turn it on or wkaeup the screen

        final PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Screen On");
        wl.acquire();
        Toast.makeText(getBaseContext(), "This is WAKEUP SCREEN", Toast.LENGTH_SHORT).show();
        Thread timer = new Thread(){
            public void run(){
                try {
                    sleep(5000);
                } catch (InterruptedException e) {
                    // TODO: handle exception
                }finally{
                    wl.release();// release wakelock important
                }
            }
        };
        timer.start();
    }

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);//keep the activity running under lock screen..

希望这有帮助