11

I'm receiving an incoming C2DM notification while the screen is locked. I'd like to wake up the screen and display the notification message on top of the lock screen using an Activity. I'm launching the notification Activity from my C2DM BroadcastReceiver as follows:

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

and within the notification Activity's onCreate method, I wake up the screen as follows:

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

The screen is woken up, but the notification Activity is not visible until I unlock the screen.

I realize that I can avoid the lock screen with the code below, but that is not desired. I want the user to unlock the phone, only if he/she is interested in reading/responding to the notification.

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

3 回答 3

2

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

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

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

于 2012-02-23T01:17:52.153 回答
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..

希望这可以帮助

于 2012-12-03T13:11:30.623 回答
0

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

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

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

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

于 2011-02-16T04:28:57.063 回答