onCreate()在Activity停止(但未销毁)时调用。仅在安装后

时间:2014-02-27 20:07:51

标签: android android-lifecycle oncreate onpause

我正在开发一款针对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;
} 

4 个答案:

答案 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)

Activity Lifecycle

在上图中,OnDestroy方法可能永远不会被调用,因为其他应用程序需要内存。

答案 3 :(得分:0)

onStop()是保证被调用的最后一个方法。在此方法之后,Android可以随时终止您的活动。查看activity's lifecycle table中的表格。有一个“Killable”专栏描述活动可以被杀死的时间。

如果您不使用静态变量并在onCreate()中正确初始化所有内容,那么您应该对此行为没有任何问题。永远不要指望onDestroy()被调用。