android - Activity 生命周期的可靠性(onPause 到 onDestroy)

标签 android lifecycle

经过多年对生命周期的信任,我做了一些挖掘。 现在我不觉得好笑。

我知道并阅读了很多关于 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/

相关文章:

android - 我在 android 中收到错误 "Unreachable statement"返回

java - 单击其中一个菜单项时更改另一个菜单项

Android:如何在 "force closed"之后自动重启应用程序?

ios - Swift 中的 socket.io 出现意外的奇怪行为

vue.js - mounted 方法在加载数据之前被触发 - VueJS

android - 如何正确回到上一个 fragment ?

android - android中的音频压缩

java - 如何强制 Maven 在站点生命周期之前运行构建生命周期?

android - ApplicationData 是在 onPause 期间存储数据的安全位置吗?

android - 一个 Activity 有多少个状态?