经过多年对生命周期的信任,我做了一点挖掘。 现在我没有被逗乐。
我知道并且阅读了很多关于onStop
不能保证被称为等的事情。
我创建了一个包含2个Activites和一个自定义Application类的简单App。我在每个回调中放了一个Log.d(),我可以在一个带有4.1的Galaxy S2上找到并玩。
活动A在开始时启动,在其onResume
中启动活动B.活动B有一个按钮,它创建一个Nullpointer但是它什么都不做。
现在担心/困惑我的事情:
如果我在buttonclick上创建一个nullpointer,应用程序崩溃并且两个活动都没有回调
如果我按下电源键并关闭屏幕,如果活动的显示模式(纵向或横向)与设备的原始方向不匹配,活动将重新启动。我知道这个以及我如何覆盖它但是如果它破坏并重新启动我的活动它会调用onPause
并且isFinishing()
返回false但活动正在完成并重新启动。
如果上述情况未发生,即使应用程序不再可见,也只会调用onPause
开始另一项活动在A中调用onPause
,然后将B创建为onResume
,然后调用A的onStop
。现在我正在跟踪.App类中的我的活动如果我在onPause
中取消注册A并在onResume
中注册B,则会有一个分裂毫秒,其中没有注册任何活动。如果我想在没有任何活动时关闭某些服务,它会一直发生。但是如果我在onStop
取消注册它(因此它们会重叠),当用户点击电源按钮并且服务(或线程或其他)继续运行并耗尽电池电量时,它将永远不会被注册。
我正在使用android已经有一段时间了,我正试图实现一个相当复杂或让我们说防弹设计。但几乎不可能跟踪我的活动发生了什么。
必须通过Intent.ACTION_SCREEN_OFF检测断电,但是当它已经关闭时会发生这种情况。之前唯一的事情就是onPause。
homebutton ... onUserInteraction和pause / stop的某种组合
很难简单地确定我的APP(不仅仅是一个活动)何时不再被使用并放入后台以及何时只是在活动之间转换或何时被系统关闭。因为.App类没有终止回调因为onTerminate()
仅在模拟器中使用,所以文档说。
也许我只是没有看到穿过树林的森林...... 帮助将不胜感激!
答案 0 :(得分:3)
Android生命周期可能非常令人困惑,到目前为止,我发现只有一种方法可以让你对周围发生的事情有一个正确的认识。
你设计你的应用程序时总是假设你可以在任何时刻被杀,而不会调用onDestroy()
这样的回调,因为无法保证它们会被调用。
一种简单的方法来检查一个Activity是否进入后台,因为你的另一个Activity正在使用一个简单的标志:
boolean movingInApp = false;
....
movingInApp = true;
Intent intent...
.....
public void onPause() {
if(movingInApp) {
//Called because we're moving to another Activity in our own app
}
}
public void onResume() {
movingInApp = false;
}
通过在启动任何意图等之前将movingInApp
的值设置为true
,您可以跟踪调用onPause()
的原因。请务必稍后在false
方法中将其设置为onResume()
。如果系统让您的应用程序转到后台,这将是错误的,并且您知道您的应用程序已被其他人移至后台,而不是您。
对于发生异常时未调用的内容,只要有未捕获的异常,Android就会立即终止整个App进程。您的应用程序只是停止运行,就像您强行退出计算机上的程序一样。系统杀死是完全没有任何警告。根本不再执行任何代码。