如何在Activity打开但屏幕已关闭的情况下,让此Activity再次打开屏幕并显示自己?

比如,我有一个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中执行的其他代码的多少有关。

我也没做过,,,不过我想了一下,是不是类似ofo的app那种?骑行页面保持显示 就算屏幕熄了 当你再次点亮屏幕 当前的页面仍然显示?这个的思路 会不会是保活?使用服务广播之类 让当前页面尽可能不被销毁 就算销毁了 也要保存好当前状态监听到屏幕亮了再次创建?

我不是这个意思。目前的安卓手机一般不会强行把一个没有切换到后台的Activity结束掉。
我的意思是我有一个Activity A在它显示的时候,也就是处于前台的时候用户关闭屏幕,这时这个Activity只是执行onStop,用户点亮屏幕,他再执行onStart,这没有问题,它还是显示在用户面前,但是现在的问题是,如果用户不主动点亮屏幕,而是因为我的程序(这个Activity只是执行onStop了,所以我的程序显然是没有退出的)接收了一个消息,然后我的程序业务上必须要求再次点亮手机屏幕显示这个A,那么问题就来了,如果用户在关闭屏幕前把A退出了,就是A执行onDestroy退出了,那么好办,用getDisplay()那段代码,不管放在onCreate里面还是onStart里面都可以亮屏并且显示A,但是如果A仅仅是onStop了,那么问题就来了,首先说,接收消息的不是A,而是我程序的其他地方,那么其他地方一定是用intent来启动这个A而不管A是不是启动了,也不用管A是不是启动了,这就是安卓的机制嘛,只要A的launchMode是singleTask或者singleInstance就可以保证只有一个A的实例嘛,那么在关屏状态下用intent启动A的话,A会重新执行onStart,理论上我在A之前启动的时候已经设置它是一个可以在锁屏上显示的Activity(用的WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED),也设置了A显示时应该亮屏(用WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON),但是当再次用intent启动这个A时,他却并没有点亮屏幕,这就是我的问题所在,无法用不被标记为Deprecated的方法来解决亮屏问题。而谷歌官方推荐的 getWindow().addFlags方法只能在Activity第一次被打开时起作用。