经过多年对生命周期的信任,我做了一些挖掘。 现在我不觉得好笑。
我知道并阅读了很多关于 onStop
不能保证被调用等的内容。
我创建了一个简单的应用程序,其中包含 2 个 Activites 和一个自定义应用程序类。我在我能找到的每个回调中都放了一个 Log.d() 并在带有 4.1 的 Galaxy S2 上玩过。
Activity A 在启动时启动,并在其 onResume
中启动 Activity B。Activity B 有一个创建 Nullpointer 的按钮,但除此之外它什么都不做。
现在让我担心/困惑的事情:
如果我在 buttonclick 上创建一个 nullpointer,应用程序会崩溃并且在两个 Activity 中都不会发生回调
如果我按下电源按钮并关闭屏幕,如果 Activity 的显示模式(纵向或横向)与设备的 native 方向不匹配,Activity 将重新启动。我确实知道这一点以及如何覆盖它,但如果它破坏并重新启动我的 Activity ,它会调用
onPause
并且isFinishing()
返回 false 但 Activity 正在完成并重新启动。如果上述情况没有发生,即使应用不再可见,也只会调用
onPause
开始另一个 Activity 调用 A 中的
onPause
,然后创建 B 到onResume
,然后调用 A 的onStop
。现在我跟踪我在 .App 类中的 Activity ,如果我在onPause
中注销 A 并在onResume
中注册 B,将有一个毫秒没有 Activity 被注册。如果我想在没有 Activity 时关闭某些服务,它会一直发生。但是,如果我在onStop
中注销它(这样它们就会重叠),当用户按下电源按钮并且服务(或线程或其他)继续运行并耗尽电池电量时,它永远不会被注销。
我现在使用 android 已经有一段时间了,我正在尝试实现一个相当复杂的或者可以说是防弹设计。但是几乎不可能跟踪我的 Activity 发生了什么。
必须通过 Intent.ACTION_SCREEN_OFF 检测断电,但当它已经关闭时会发生这种情况。在此之前唯一的事情就是 onPause。
homebutton...onUserInteraction 和暂停/停止的某种组合
很难简单地确定我的应用程序(不仅仅是一个 Activity )何时不再被使用并置于后台,以及何时它只是在 Activity 之间转换或何时被系统关闭。因为 .App 类没有终止回调,因为 onTerminate()
仅在模拟器中使用,所以文档说。
也许我只是没有透过树木看到森林...... 帮助将不胜感激!
最佳答案
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;
}
通过在启动任何 Intent 等之前将 movingInApp
的值设置为 true
,您可以跟踪调用 onPause()
的原因.请记住稍后在您的 onResume()
方法中再次将其设置为 false
。如果系统让您的应用程序进入后台,这将是错误的,并且您知道您的应用程序被其他人而不是您移到了后台。
至于异常发生时什么都不调用,只要有未捕获的异常,Android 就会简单地杀死你的整个 App 进程。您的应用程序会停止运行,就像您强制退出计算机上的程序一样。系统杀完全,没有任何警告。根本不再执行任何代码。
关于android - Activity 生命周期的可靠性(onPause 到 onDestroy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705271/