代码之家  ›  专栏  ›  技术社区  ›  Kajuna

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

  •  4
  • Kajuna  · 技术社区  · 11 年前

    我正在开发一个针对Api 19的应用程序,这基本上是一个加工草图。

    我面临的问题是,我的应用程序在安装后第一次运行时,在用户将其发送到后台之前,它运行良好。然后,如果他们再次单击应用程序图标,就会调用onCreate(),但活动不会被破坏或重新启动。一些变量发生变化,从而产生奇怪的行为。

    这仅在应用程序首次使用时发生。在强制关闭后,这种行为不会再发生(据我所测试)。从Eclipse启动应用程序时也不会发生这种情况。

    总结一下,这是第一次力量关闭后发生的情况(我认为是正确的):

    • 活动正在运行。

    • 活动通过主页按钮发送到后台

    • 打开暂停()

    • 我们再次单击应用程序图标

    • 打开恢复()

    这是安装后第一次运行应用程序时发生的情况:

    • 活动正在运行。

    • 活动通过主页按钮发送到后台

    • 打开暂停()

    • 我们再次单击应用程序图标

    • onCreate()<--!!注释no onDestroy()

    • 打开恢复()

    我想知道我使用沉浸式模式是否与此有关,但将Api目标版本更改为10、删除沉浸式模式或在旧设备上进行测试都无济于事。我当然用过 android:configChanges=“orientation | keyboardHidden | screenSize” 在我的清单上。

    有人知道是什么导致了这一点吗?这是一个常见问题,还是我应该在代码中查找bug?可能是处理错误?

    提前感谢您提供任何线索。我希望这是问这个问题的正确方式。这是我的第一篇文章。

    更新: 我的解释不是很准确,但显然有一个错误报告。这个问题在这里解释得更好: https://code.google.com/p/android/issues/detail?id=26658

    不幸的是,我无法使建议的解决方案发挥作用,在onCreate()中使用此选项会导致我的应用程序关闭或崩溃:

    if (!isTaskRoot()) {
      finish();
      return;
    } 
    
    4 回复  |  直到 11 年前
        1
  •  5
  •   Kajuna    11 年前

    好吧,这就是我解决问题的方法,以防其他人撞上这堵墙。

    这可能会特别影响来自加工开发环境的人,因为它将“加工草图”转换为项目的唯一活动。

    最初的问题(Android在从包安装程序启动应用程序时以不同的-错误的?-方式管理应用程序)在这里得到了很好的解释: https://code.google.com/p/android/issues/detail?id=26658

    发布在那里的解决方案可能会解决大多数情况,但如果-像我一样-你的启动器活动是执行所有工作的活动,你将需要创建一个特定的启动器活动,它只是启动主活动。。。并在Android错误发生时自杀。

    将此位添加到启动器活动的onCreate()方法中:

    if (!isTaskRoot()) {
     finish();
     return;
    } 
    

    我希望这有帮助。

        2
  •  3
  •   marcinj    11 年前

    这看起来像是一个有效的应用程序生命周期,你将你的应用程序置于后台,然后允许android销毁你的应用。onDestroy不一定会被调用,你必须做好准备,正如你所说的,onPause被调用,这样你就可以使用它。为什么安装后只会发生一次,这很难解释,但在我看来,你不应该真正关心它,并做好准备,让你的应用程序在后台随时被杀死。

        3
  •  1
  •   Mahdi-bagvand    11 年前

    Activity Lifecycle

    在上图中,OnDestroy方法可能从未调用,因为其他应用程序需要内存。

        4
  •  0
  •   sergej shafarenka    11 年前

    onStop() 是保证调用的最后一个方法。使用此方法后,Android可以随时终止您的活动。查看 activity's lifecycle table 。有一个“可杀死”列,描述可以杀死活动的时间。

    如果不使用静态变量,并且在 onCreate() ,那么您应该对此行为没有任何问题。只是没想到 onDestroy() 将被调用。