活动生命周期的可靠性(onPause到onDestory)

Nik*_*kyD 5 lifecycle android

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

我知道并阅读了很多关于onStop不能保证被称为等的内容.

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

现在担心/混淆我的事情:

  • 如果我在buttonclick上创建一个nullpointer,应用程序崩溃并且两个活动都没有回调

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

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

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

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

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

  • homebutton ... onUserInteraction和pause/stop的某种组合

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

也许我只是没有看到森林穿过树林...帮助将不胜感激!

Rag*_*ood 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;

}
Run Code Online (Sandbox Code Playgroud)

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

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