我有一个演示应用程序有两个活动。应用程序启动时启动父程序,子程序通过父程序中的按钮启动。子项设置为透明背景,这样子项启动时父项不会停止。
我启动应用程序,启动父程序,然后启动子程序。然后我锁上装置。我看到子调用onstop(),然后父调用onstop()。
但是,如果我没有锁定应用程序,而是旋转设备,这会触发方向更改,那么当我锁定应用程序时,只有子调用onstop()。在我解锁应用程序并按下后退按钮后,子和父都调用onstop(),因此父活动处于这种不可见的奇怪状态,但它没有调用onstop()。
为什么会这样?
当设备锁定时,如何让父级调用onstop()?
我创建了一个简单的android项目来演示我看到的问题。
https://github.com/skykelsey/Rotation
最佳答案
如果我launch the app -> start ChildActivity -> rotate the device -> lock the device -> unlock the device
,这就是我在Nexus5(Android 5.0.1)上得到的:
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape
也就是说,不能再现你所描述的问题。事实上,如果您偶尔看不到
onStop()
是正常的,因为它不能保证被调用。protected void onStop ()
请注意,在内存不足的情况下,可能永远不会调用此方法,在这种情况下,系统没有足够的内存来在调用其onpause()方法后保持活动进程的运行。
此外,请参阅该页上提供的活动生命周期表:
突出显示的文本读作
注意上表中的“killable”列——对于那些被标记为killable的方法,在该方法返回之后,承载活动的进程可能随时被系统杀死,而不执行其代码的另一行。因此,应该使用onpause()方法将任何持久数据(如用户编辑)写入存储。
也就是说,如果您正在执行的操作很重要,您应该使用
onPause()
而不是onStop()
。希望这有帮助。