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
返回false,但活动正在完成并重新启动isFinishing()
- 如果上述情况未发生,则即使应用程序不再可见,也只会调用
onPause
- 启动另一个活动调用A中的
,然后创建B到onPause
,然后调用A的onResume
。现在我正在.App类中跟踪我的活动,如果我在onStop
中注销A,在onPause
中注册B,在没有活动注册的情况下,将有一个拆分毫秒。如果我想在没有任何活动的情况下关闭某些服务,那么这种情况就会一直发生。但是如果我在onResume
(这样它们就会重叠)中注销它,当用户点击电源按钮,服务(或线程或其他)继续运行并耗尽电池电量时,它将永远不会被注销onStop
- 必须通过Intent.ACTION\u SCREEN\u OFF检测断电,但在断电时会发生这种情况。在此之前唯一的事情就是暂停
- 主页按钮。。。onUserInteraction和暂停/停止的一些组合
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状态。没有碎片,这在更大的应用程序中非常常见。