比如,我有一个Activity在收到消息的时候必须点亮屏幕并显示给用户看。
我们都知道在onCreate里使用
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
以上代码可以做到在手机锁屏时点亮屏幕并弹出你的Activity,但是此段代码不能保证你的Activity在已经打开的情况下,然后用户锁屏,然后此Activity收到事件要再次打开屏幕时仍然好用。
就是说,你的Activity打开了,然后用户关闭屏幕,此时你的Activity执行onStop了,但是并没有退出,然后你的Activity收到消息要点亮屏幕并显示自己(在锁屏之上),此种场景就无法用上面的代码实现。
用以下代码可以实现开屏并显示,但是里面用的东西已经是在API17时就标记为作废了。且需要额外申请android.permission.WAKE_LOCK权限。
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
mWakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "VideoChat");
mWakeLock.acquire();
我的最小API是18,目标API是25,如何用没有作废标记的代码实现开屏显示呢?
我再说清楚点,就是我有个Activity A,它的launchMode是singleTask,也就是用Intent开启它时始终只保持一个实例,每次我的系统收到某个事件后,就用Intent开启这个Activity,那么这个Activity没有启动自然好说,用最前面的代码可以让他启动时点亮屏幕并在锁屏之上显示,但是如果用户在使用手机的过程中,自己手动打开了这个Activity,或者哪怕是我的系统将此Activity打开,此时是在屏幕已经点亮的情况下开的Activity,用户可以在这个Activity打开的状态下直接关闭屏幕,那么这个Activity会执行onStop但是并没有onDestroy退出,那么此时,屏幕是关闭的,如果我的系统再收到通知,又要通过Intent开启此Activity时,如果不使用上面的被标记为作废的PowerManager的方法,就没法点亮屏幕并显示给用户,即便在onStart里使用getWindow().addFlags也无济于事,所以我的问题就是有没有不被标记为作废的代码能实现以上开屏显示的要求?
我还试过在onStart里使用getWindow().addFlags,在onStop中使用getWindow().clearFlags,这种方法有时可以点亮屏幕,有时不行。好像跟onStart和onStop中执行的其他代码的多少有关。