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

问题描述:

我在锁定屏幕时收到传入的C2DM通知。我想要唤醒屏幕并使用活动在锁定屏幕上显示通知消息。我发动从我的C2DM广播接收器的通知活动如下:如何创建在锁定屏幕顶部可见的活动

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

和通知活动的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 
); 
+2

好像你正在使用Android系统。这将是一个好主意,添加android标签,让更多的人可以看到你的问题。 – f20k 2011-02-15 21:22:55

+0

@ f20k,是的,它是Android,thx – 2011-02-15 23:55:56

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

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

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

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

+0

我试图模仿iPhone的行为。当手机处于睡眠状态时,传入的通知会唤醒手机,并在弹出窗口中显示通知,但不会解锁手机。如果用户解锁手机,则打开通知的目标应用程序。 – 2011-02-16 13:19:36

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

Android有点矛盾。这是非常开放的,作为一个开发者,你可以使用任何东西,这取决于你使用这些权力的好坏。当我说邪恶时,我不是指恶意软件。我的意思是应用程序试图让自己变得可爱,并以他们不打算使用的方式使用事物,比如提出要求您更多地使用应用程序的通知。矛盾之处在于,你实际上并没有获得任何东西,开发者认为有几个部分非常重要,以至于应用程序不能混淆它们。锁屏是其中一个部分。您可以随时更换您的家庭应用程序,但无需担心更换锁定屏幕失败并阻止您访问您的手机。

即使这是可能的,你会有更多的问题需要处理。每个锁屏都不一样,制造商可以自定义它,所以你不能保证你的活动不会妨碍解锁手机。

试试这个在您的活动

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.. 

希望这有助于