Android 活动生命周期的可靠性(暂停至故事)

Android 活动生命周期的可靠性(暂停至故事),android,lifecycle,Android,Lifecycle,在多年信任生命周期之后,我做了一些挖掘。 现在我不觉得好笑了 我知道并阅读了很多关于onStop不能保证被调用等的信息 我创建了一个包含2个活动和一个自定义应用程序类的简单应用程序。我在我能找到的每个回调中都放了一个Log.d(),并在一个上面有4.1的Galaxy S2上玩。 活动A在开始时启动,并在其onResume中启动活动B。活动B有一个按钮,用于创建空指针,但在其他情况下,它什么也不做 现在让我担心/困惑的是: 如果我在buttonclick上创建一个空指针,应用程序就会崩溃,并且两

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

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

我创建了一个包含2个活动和一个自定义应用程序类的简单应用程序。我在我能找到的每个回调中都放了一个Log.d(),并在一个上面有4.1的Galaxy S2上玩。 活动A在开始时启动,并在其
onResume
中启动活动B。活动B有一个按钮,用于创建空指针,但在其他情况下,它什么也不做

现在让我担心/困惑的是:

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

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

  • 如果上述情况未发生,则即使应用程序不再可见,也只会调用
    onPause

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

我在安卓系统上工作了相当长的一段时间,我试图实现一个相当复杂的或者说防弹的设计。但几乎不可能跟踪我的活动发生了什么

  • 必须通过Intent.ACTION\u SCREEN\u OFF检测断电,但在断电时会发生这种情况。在此之前唯一的事情就是暂停

  • 主页按钮。。。onUserInteraction和暂停/停止的一些组合

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

也许我只是没有透过树林看到森林。。。
谢谢你的帮助

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;

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


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

我不知道如果我没有在本机代码中发布某些东西,我的应用程序就会被这样杀掉,会发生什么。@doctordrive我并没有真正使用NDK,所以我不确定,但我猜你所做的一切,无论是从本机代码还是Java,都会完全停止。应用程序使用的所有资源都将被释放,任何未完成的文件IO都将按原样停止。@MisterSmith先生,我认为这不会成为问题。只有一个UI线程,我不明白你为什么要从后台线程访问该标志。@RaghavSood是的,很有可能,但我想确定。很抱歉不接受这个答案,但我觉得它只回答了问题的一小部分。我很好奇你为什么关心这个问题。只要活动暂停,您就应该释放资源。我会在暂停时做几乎所有的事情。因为不是所有的事情都能在毫秒内重新开始,暂停可能仅仅意味着转换到另一个活动。你想用ms accuracy做什么?你能在你的问题中用一个例子来详细说明这一点吗?无论如何,IMHO,您应该保持设计简单,并使用
onPause/onResume
,无论是什么触发它(设备旋转、任何其他配置更改、设备进入睡眠状态、用户按下按钮等)。想想你目前的方法所遇到的所有困难:是否真的需要检测整个因果关系?你能用另一种更简单的方法做同样的事情吗?最好的例子是连接到服务器(比如在游戏中)。如果您在每次暂停时断开连接,并在下一次恢复时重新连接,则每次切换活动时,您都将处于dis/con状态。没有碎片,这在更大的应用程序中非常常见。