【问题标题】:How do I create an Activity that is visible on top of the lock screen如何创建在锁定屏幕顶部可见的 Activity
【发布时间】:2011-02-15 21:17:23
【问题描述】:

我在屏幕锁定时收到传入的 C2DM 通知。我想使用 Activity 唤醒屏幕并在锁定屏幕顶部显示通知消息。我正在从我的 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();
}

屏幕已唤醒,但在我解锁屏幕之前,通知 Activity 不可见。

我意识到我可以使用下面的代码来避免锁定屏幕,但这不是我们所希望的。我希望用户解锁手机,前提是他/她有兴趣阅读/响应通知。

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

【问题讨论】:

  • 您好像在使用 Android。最好添加 android 标签,以便更多人可以看到您的问题。
  • @f20k,是的,它是 Android,谢谢

标签: android locking wakeup


【解决方案1】:

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

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

即使这是可能的,你也会有更多的问题需要处理。每个锁定屏幕都不同,制造商可以并且确实对其进行自定义,因此您无法保证您的活动不会妨碍手机解锁。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我正在尝试模仿 iPhone 的行为。当手机处于睡眠状态时,传入的通知会唤醒手机并在弹出窗口中显示通知,但不会解锁手机。如果用户解锁手机,则会打开通知的目标应用。
    • 所以我确实希望用户在解锁设备之前看到通知,而不是在状态栏中,更像是 Toast 消息。
    【解决方案3】:

    在你的活动中试试这个

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

    希望对你有帮助

    【讨论】:

    • 是的,我在我的应用程序中使用它。虽然WakeLock 正在使用中。
    • 我从 IDE 收到警告不要使用这种唤醒方式,并尝试使用下一种:window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    • 2012-12-14
    • 2020-05-03
    相关资源
    最近更新 更多