5

在多年信任生命周期之后,我做了一点挖掘。现在我不开心了。

我知道并阅读了很多关于onStop不能保证被调用的内容等。

我创建了一个带有 2 个 Activites 和一个自定义应用程序类的简单应用程序。我在每个可以找到的回调中都放了一个 Log.d(),并在带有 4.1 的 Galaxy S2 上播放。Activity A 在启动时启动,并在onResume它启动 Activity B 时启动。Activity B 有一个创建 Nullpointer 的 Button,否则它什么也不做。

现在让我担心/困惑的事情:

  • 如果我在 buttonclick 上创建一个空指针,则应用程序崩溃并且在这两个活动中都不会发生回调

  • 如果我按下电源按钮并关闭屏幕,如果活动的显示模式(纵向或横向)与设备的本机方向不匹配,活动将重新启动。我确实知道这一点以及如何覆盖它,但如果它破坏并重新启动我的活动,它会调用onPauseisFinishing()返回 false,但活动正在完成并重新启动。

  • 如果上面没有发生,onPause即使应用程序不再可见,也只会被调用

  • 在 A 中启动另一个活动调用onPause,然后创建 B 到onResume然后调用onStopA。现在我在 .App 类中跟踪我的活动,如果我在 A 中取消注册onPause并在 B 中注册 B onResume,将有一个毫秒的时间间隔没有注册活动. 如果我想在没有活动时关闭某些服务,它会一直发生。但是,如果我取消注册它onStop(所以它们会重叠),当用户点击电源按钮并且服务(或线程或其他)继续运行并耗尽电池电量时,它将永远不会被取消注册。

我现在使用 android 已经有一段时间了,我正在尝试实现一个相当复杂的设计,或者说是防弹设计。但是几乎不可能跟踪我的活动发生了什么。

  • 必须通过 Intent.ACTION_SCREEN_OFF 检测到断电,但这会在它已经关闭时发生。在那之前唯一的事情就是onPause。

  • 主页按钮... onUserInteraction 和暂停/停止的某种组合

很难简单地确定我的应用程序(不仅仅是一个活动)何时不再被使用并置于后台,何时它只是在活动之间转换或何时被系统关闭。因为 .App 类没有终止回调,因为onTerminate()仅在模拟器中使用,所以文档说。

也许我只是没有看到树林中的森林......我们将不胜感激!

4

1 回答 1

3

Android 生命周期可能非常混乱,到目前为止,我发现只有一种方法可以让您对周围发生的事情有一个不错的了解。

你设计你的应用程序的方式总是假设你可以在任何时刻被杀死而没有像onDestroy()被调用这样的回调,因为不能保证它们会被调用。

检查一个活动是否进入后台的一种简单方法是使用一个简单的标志:

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;

}

通过在启动任何意图等之前将值设置为movingInApptrue您可以跟踪onPause()调用的原因。请记住false稍后在您的onResume()方法中再次将其设置为。如果系统让您的应用程序进入后台,这将是错误的,并且您知道您的应用程序是由其他人而不是您移动到后台的。

至于发生异常时不调用任何内容,只要有未捕获的异常,Android 就会简单地杀死您的整个 App 进程。您的应用程序只是停止运行,例如当您强制退出计算机上的程序时。系统杀戮是完全没有任何警告的。不再执行任何代码。

于 2013-02-05T10:40:23.073 回答