活动开始但在屏幕关闭或锁定时不可见

Posted

技术标签:

【中文标题】活动开始但在屏幕关闭或锁定时不可见【英文标题】:Activity starts but isn't visible when the screen is off or locked 【发布时间】:2020-01-31 23:48:59 【问题描述】:

我正在创建一个提醒应用程序,几乎一切正常,除了在闹钟响起时启动的活动在屏幕关闭时不显示(手机处于睡眠状态)。当屏幕打开时,看到 android 的主桌面,并且警报响起,活动看起来非常好。

我使用 AlarmManager.setExactAndAllowWhileIdle(RTC_WAKEUP, ...) 来设置一个闹钟,它会在某个时间被调用。

这就是我从 AlarmManager 接收意图的方式:

@Override
public void onReceive(Context context, Intent intent) 
    int alarmId = intent.getIntExtra(Constants.REMINDER_ALARM_ID, 0);

    Intent goingOffIntent = new Intent(context, GoingOffActivity.class);
    goingOffIntent.putExtra(Constants.REMINDER_ALARM_ID, alarmId);

    context.startActivity(goingOffIntent);

这是 GoingOffActivity 的 onCreate:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_going_off);
context = this;

getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

loadData(getIntent());

当屏幕关闭并且警报响起时,这些条目在日志中创建:

18:35:03.593 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate
18:35:03.661 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate finish
18:35:03.674 20113-20113/me.mitulat.myProgram W/MyProgram: onPause
18:35:03.675 20113-20113/me.mitulat.myProgram W/MyProgram: onPause finish
18:35:03.714 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:35:03.724 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish

GoingOffActivity 立即结束。

当屏幕打开但它被某种图案锁定时,会发生这种情况:

18:30:00.503 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate
18:30:00.585 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate finish
18:30:00.598 20113-20113/me.mitulat.myProgram W/MyProgram: onPause
18:30:00.599 20113-20113/me.mitulat.myProgram W/MyProgram: onPause finish
18:30:00.635 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:30:00.655 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish
18:30:00.764 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:30:00.769 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish

我正在真实设备上进行测试,在 build.gradle 中设置了 minSdkVersion 23。

我做错了什么?

【问题讨论】:

见setShowWhenLocked() 这需要 API 级别 27。我为 API 级别 23 开发。 发生这种情况的设备的实际 API 级别是多少? 我只是确保您没有在onPause() 中调用finish() 您可能不想这样做。请参阅警告here。我相信onStop() 包含在那个“双生命周期事件”中。 IOW,您可以期待在您的活动有时间出现在屏幕上之前发生onStop(),如果您在此期间调用finish(),那么onStop(),那就结束了。您的活动将永远不会出现。 【参考方案1】:

引用 here 的双生命周期事件是解除键盘保护的“窗口标志”方法的已知限制,直到 API 27 才修复。这意味着 Activity 可以暂停和停止在它出现在屏幕上之前。

如果您不finish()Activity,通常会再次onResume(),一切都会好起来的。但如果你在onPause()onStop() 中调用finish(),那将导致Activity 进入销毁状态,而你将永远看不到它。

解决方案是删除在Activity 可见之前发生的所有finish() 调用。

【讨论】:

以上是关于活动开始但在屏幕关闭或锁定时不可见的主要内容,如果未能解决你的问题,请参考以下文章

锁定屏幕上的透明活动

活动从锁定屏幕开始时没有声音

在 Android Q 的锁定屏幕上收到 fcm 通知后开始活动

以编程方式锁定或关闭屏幕

如何在不锁定活动方向的情况下锁定片段方向?

屏幕关闭时从 BroadcastReceiver 打开 Activity