android - Activity 开始但在屏幕关闭或锁定时不可见

标签 android android-intent android-activity alarm activity-lifecycle

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

我使用 AlarmManager.setExactAndAllowWhileIdle(RTC_WAKEUP, ...) 设置闹钟,在特定时间调用。

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

@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。

我做错了什么?

最佳答案

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

如果您不finish() Activity,它通常会 onResume() 第二次,一切都会美好的。但是,如果您确实在 onPause()onStop() 中调用了 finish(),那将导致 Activity 进入销毁状态,你将永远看不到它。

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

关于android - Activity 开始但在屏幕关闭或锁定时不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205908/

相关文章:

android - 使用Intent的Youtube播放列表,不显示对话框

java - "getIntent()"- 它是如何工作的

android - 如何实现activity和FragmentActivity的父方法?

android - 如何在 Android 中以编程方式启动软件更新?

android - PendingIntent 启动应用程序包的不同 Activity

android - 如何获得谁向服务发送了 Intent ?

android - 如何在 Activity 中恢复 fragment 返回堆栈(应用程序在后台被杀死后)

android - 是否可以在 GLSurfaceView 中绘制 View 或 ViewGroup

android - Cordova ENOENT 错误

android - 如何防止元素隐藏在透明操作栏后面