Activity 启动但在屏幕关闭或锁定时不可见
Activity starts but isn't visible when the screen is off or locked
我正在创建一个提醒应用程序,几乎一切正常,除了闹钟响起时启动的 activity 在屏幕关闭时不会显示(phone在睡觉)。当屏幕打开时,看到 Android 的主桌面,闹钟消失 activity 看起来完全正常。
我用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。
我做错了什么?
引用的双生命周期事件 here 是 "window flags" 关闭键盘保护方法的已知限制,直到 API 27 才修复。这意味着Activity
可以在它出现在屏幕上之前暂停和停止。
如果您不 finish()
Activity
,通常会 onResume()
第二次,一切都会好起来的。但是如果你确实在 onPause()
或 onStop()
中调用了 finish()
,这将导致 Activity
进入销毁状态,你将永远看不到它。
解决方案是删除 Activity
可见之前发生的所有 finish()
调用。
我正在创建一个提醒应用程序,几乎一切正常,除了闹钟响起时启动的 activity 在屏幕关闭时不会显示(phone在睡觉)。当屏幕打开时,看到 Android 的主桌面,闹钟消失 activity 看起来完全正常。
我用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。
我做错了什么?
引用的双生命周期事件 here 是 "window flags" 关闭键盘保护方法的已知限制,直到 API 27 才修复。这意味着Activity
可以在它出现在屏幕上之前暂停和停止。
如果您不 finish()
Activity
,通常会 onResume()
第二次,一切都会好起来的。但是如果你确实在 onPause()
或 onStop()
中调用了 finish()
,这将导致 Activity
进入销毁状态,你将永远看不到它。
解决方案是删除 Activity
可见之前发生的所有 finish()
调用。