我正在开发一款针对Api 19的应用程序,这基本上就是一个处理草图。
我面临的问题是,我的应用程序第一次运行时,在安装它之后,它一直运行良好,直到用户将其发送到后台。然后,如果他们再次单击应用程序图标,则会调用onCreate(),但不会销毁或重新启动活动。一些变量会发生变化并产生奇怪的行为。
只有在第一次使用该应用时才会发生这种情况。强制关闭后,这种行为不会再发生(据我测试过)。从Eclipse启动应用程序时也不会发生这种情况。
总结一下,这是在第一次关闭之后发生的事情(以及我认为正确的事情):
活动正在运行。
通过主页按钮发送回活动
的onPause()
我们再次点击应用图标
的onResume()
这就是 - 安装后第一次运行应用程序时发生的事情:
活动正在运行。
通过主页按钮发送回活动
的onPause()
我们再次点击应用图标
onCreate()< - !!注意没有onDestroy()
的onResume()
我想知道我使用沉浸式模式的事实是否与此有关,但是将Api目标版本更改为10,删除沉浸式模式或在旧设备上进行测试无济于事。当然,我在我的清单上使用了 android:configChanges =“orientation | keyboardHidden | screenSize”。
有没有人知道可能导致这种情况的原因?这是一个常见问题还是我应该在代码中查找错误?也许是一个处理错误?
提前感谢任何线索。我希望这是询问这个问题的正确方法。这是我的第一篇文章。
更新 我的解释不是很准确,但显然有一个错误报告。这里更好地解释了这个问题:https://code.google.com/p/android/issues/detail?id=26658
不幸的是,我无法让建议的解决方案起作用,在onCreate()中使用它会导致我的应用关闭或崩溃:
if (!isTaskRoot()) {
finish();
return;
}
答案 0 :(得分:4)
好的,这就是我解决它的方式,以防其他人碰到这堵墙。
这可能会影响来自Processing Developing Environment的人,因为它将“Processing sketch”转换为项目的唯一活动。
原始问题(Android管理应用程序以不同的方式 - 从包安装程序启动它们时的方式)在这里得到了很好的解释:https://code.google.com/p/android/issues/detail?id=26658
在那里发布的解决方案可能会解决大多数情况,但如果 - 像我一样 - 您的启动器活动是执行所有工作的活动,您将需要创建一个特定的启动器活动,只启动主要活动...并提交当Android错误发生时自杀。
将此位添加到启动器活动的onCreate()方法中:
if (!isTaskRoot()) {
finish();
return;
}
我希望这会有所帮助。
答案 1 :(得分:3)
这看起来像一个有效的应用程序生命周期,你把你的应用程序放到后台,然后允许android摧毁你的应用程序。 onDestroy不能保证被调用,你必须为此做好准备,就像你说onPause被调用所以你可以使用它。为什么它在安装后只发生一次很难解释,但在我看来,你不应该真正关心它,并准备你的应用程序在后台任何时候被杀死。
答案 2 :(得分:1)
答案 3 :(得分:0)
onStop()
是保证被调用的最后一个方法。在此方法之后,Android可以随时终止您的活动。查看activity's lifecycle table中的表格。有一个“Killable”专栏描述活动可以被杀死的时间。
如果您不使用静态变量并在onCreate()
中正确初始化所有内容,那么您应该对此行为没有任何问题。永远不要指望onDestroy()
被调用。