【问题标题】:pressing home button and access app again from app icon call onCreate?按下主页按钮并从应用程序图标调用 onCreate 再次访问应用程序?
【发布时间】:2013-12-05 08:00:34
【问题描述】:

我有一个离线在线应用程序,我在其中发现了一个奇怪的问题,可能不是,但我不明白..
应用程序要求是,如果互联网可用,即使从启动应用程序或从恢复开始,我都会调用 web 服务并将数据存储在 sqlite 中,否则应用程序将保持离线模式,
我有 2 个活动,第二个活动包含一个 id,我通过意图(这一点很重要),
我的问题:
如果我在第二个活动中,并且互联网正在运行,并且我按下主页按钮,那么这个第二个活动暂停,然后停止这是 android 中的默认行为,我转到设置,关闭 wifi,然后按应用程序 icon 再次回到我的应用程序,在这里我很困惑,我希望我的应用程序现在将在 onResume 中,但是当我在 logcat 中看到它的 onCreated 调用和应用程序 崩溃,发生 nullPointerException,因为第二个活动没有那个 id,我通过了意图..

注意:
如果我使用最近的应用程序按钮转到“设置”,然后在关闭 wifi 后再次返回,并重复所有这些行为,然后工作正常,它的 onResumes 称为 not oncreate..

我的问题
为什么当我从应用程序图标回来时我的期望是 onResume 时它会在 onCreate 中进行?

【问题讨论】:

    标签: android android-activity


    【解决方案1】:

    NPE 的原因很清楚,您的第二个活动没有价值并且它崩溃了。

    那你为什么会有不同的行为呢!?

    这是因为发射意图不同。当您“切换任务”时,Android 只是停止您的应用程序,但将其留在那里(不保证)以防您想切换回来。

    Going home (with home) 是您想要离开应用程序的明确指示,虽然它会保留在内存中并缓存(只要有可用内存),但通过启动器(或应用程序图标作为您称之为)触发 LAUNCHER 类别(首先进入您的 Activity 1)。

    查看this StackOverflow 问题(和答案)以更好地了解后果。

    无论如何,您的问题是您的应用必须始终设计为在不一致的状态下恢复并能够恢复。 Android 杀死您的引用,会破坏您的变量,并且很可能会在一夜之间将您的应用送入地狱,即使您运行它……如果手机处于待机状态时,不做任何事情的进程很可能会被暂停/停止并可能被杀死。

    重新设计您的应用,让这不是问题。

    你说:

    “我有 2 个活动,第二个活动包含一个 id,我通过 通过意图(这一点很重要),”

    好吧,为什么不让它变得更简单,并拥有一个活动和两个片段呢?然后使用 Fragment Arguments 传递值?

    或者为什么不将值存储在首选项和/或本地数据库中并在 onCreate 期间恢复它?

    而且为什么不这样做,如果 Activity 2 没有值,它会调用 Activity 1 并自行关闭(比崩溃好,对吧?)。

    等等

    正如您所见,您应该考虑很多事情。总而言之,永远不要相信您的应用会活着,因为它不会。

    【讨论】:

    • 哇..很好的答案和很好的解决方案,我现在明白了,并使用 savedInstanceState 来保存和恢复我的 id。很高兴看到这个阐述,非常感谢:)
    • 很高兴看到它有所帮助。请小心使用 savedInstanceState。该捆绑包仅用于在 Activity 或 Fragment 的生命周期中临时保存状态,而不是作为永久存储解决方案。请阅读此 Stack Overflow 线程以获得一个想法:stackoverflow.com/questions/151777/… 您可以在 Martin Belcher - Eigo 的结尾处看到一个非常好的解释
    【解决方案2】:

    一旦您的活动的 onStop 被调用,它很容易被 android 系统杀死以收集其他应用程序的资源,这就是我认为在您的情况下发生的情况。如果它被杀死,当您返回时,android 显然会调用 OnCreate activity.Check this 进行澄清。为了进行试验,您可以尝试从最近的应用中打开多个应用,然后返回您的应用。它现在也可能在那里崩溃。

    【讨论】:

      【解决方案3】:

      您说如果您转到设置,您可以看到活动已停止(onStop)。这就是 Android 活动生命周期中显示的行为。 onStop 的对应物是 onCreate。所以它按照文档告诉我们的去做。顺便说一句,如果活动以某种方式可见,它们就会暂停,如果它们不再可见,就会停止。这可以解释为什么您的活动会暂停。更多信息请阅读Managing the Activity Lifecycle。您可以找到生命周期的全貌here

      【讨论】:

      • 等一下,我还说,如果我使用设备上最近的应用程序按钮在应用程序之间切换,那么它也会暂停,调用 onstop,并且当我从同一个最近的应用程序按钮切换回来时,这一次我的 onResume 调用..它应该是 onCreate 以防你的回答?不是吗?
      • onStop() 对应的是onStart() 而不是onCreate()
      • @MartínMarconcini 对于所描述的行为(App 进程被杀死)对应的是onCreate() 方法。否则,如果活动只是停止,你是对的。看一下生命周期图,左边和右边都有一条路径。 ;)
      • @Baschi 好吧,你是对的,它可以以任何一种方式发展,但前提是它被破坏(正在发生并且最终会发生)。
      【解决方案4】:

      当您更改某些系统配置(如字体类型、字体大小或语言)时,可以看到此类行为。但是打开/关闭 wifi 不会破坏应用程序并重新创建它。查看http://developer.android.com/guide/topics/manifest/activity-element.html#config了解更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多