Android 按home(主页)按钮并再次从应用图标访问应用程序call onCreate(创建)?

Android 按home(主页)按钮并再次从应用图标访问应用程序call onCreate(创建)?,android,android-activity,Android,Android Activity,我有一个离线在线应用程序,我在其中发现了一个奇怪的问题,可能不是,但我不了解它。 应用程序的要求是,若互联网可用,即使从启动应用程序或从恢复应用程序开始,我也会调用Web服务并在sqlite中存储数据,否则应用程序将保持脱机模式, 我有两个活动,第二个活动包含一个id,我通过意图传递它(这一点很重要), 我的问题: 如果我在第二个活动中,互联网正在运行,我按home按钮,第二个活动暂停,然后停止,这是android中的默认行为,我转到设置,关闭wifi,然后再次按app图标回到我的应用程序中,我

我有一个离线在线应用程序,我在其中发现了一个奇怪的问题,可能不是,但我不了解它。
应用程序的要求是,若互联网可用,即使从启动应用程序或从恢复应用程序开始,我也会调用Web服务并在sqlite中存储数据,否则应用程序将保持脱机模式,
我有两个活动,第二个活动包含一个id,我通过意图传递它(这一点很重要),
我的问题:
如果我在第二个活动中,互联网正在运行,我按home按钮,第二个活动暂停,然后停止,这是android中的默认行为,我转到设置,关闭wifi,然后再次按app图标回到我的应用程序中,我感到困惑,我希望我的应用程序现在将在恢复时处于状态,但当我在logcat中看到它的onCreated调用并应用 崩溃,发生nullPointerException,因为第二个活动没有该id,所以我通过了intent

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

我的问题

为什么当我从应用程序图标返回时,它会在onCreate中运行?我的期望是在Resume上运行

您说过,如果转到设置,您可以看到活动已停止(在顶部)。这就是Android活动生命周期中显示的行为。onStop的对应项是onCreate。因此,它符合文档中的要求。顺便说一句,如果活动以某种方式可见,则会暂停;如果活动不再可见,则会停止。这可以解释为什么您的活动会暂停。欲了解更多信息,请阅读。您可以看到整个生命周期。

当您更改某些系统配置(如字体类型、字体大小或语言)时,可以看到这种行为。但打开/关闭wifi不会破坏应用程序并重新创建它。查看更多信息

一旦你的活动的桌面被调用,它很容易被android系统杀死,以收集其他应用程序的资源,我认为这就是你的情况。如果它被杀死,当你回到活动时,android显然会调用OnCreate。请检查澄清。对于实验,您可以尝试从最近的应用中打开多个应用,然后返回到您的应用。它现在也可能在那里崩溃。

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

那你为什么会有不同的行为

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

回家(带回家)是您想要离开应用程序的明确指示,尽管它将保留在内存中并缓存(只要有可用内存),但通过启动器(或您称之为应用程序图标)返回会触发启动器类别(首先进入活动1)

看看StackOverflow问题(和答案),以更好地理解其后果

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

重新设计你的应用程序,这样就不会有问题了

你说:

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

那么,为什么不让它变得更简单,有一个活动和两个片段呢?然后使用片段参数传递值

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

还有,为什么不这样做呢?如果活动2没有值,它调用活动1并关闭自己(比崩溃好,嗯?)

等等


正如你所看到的,有很多事情你应该考虑。总之,永远不要相信你的应用程序会活着,因为它不会

等等,我还说过,如果我使用设备上的“最新应用程序”按钮在应用程序之间切换,那么它也将处于暂停状态,并调用onstop,当我从同一个“最新应用程序”按钮切换回来时,这一次我的onResume将调用..如果您回答,它应该是onCreate?不是吗?
onstop()
的对应项是
onStart()
not
onCreate()
@MartínMarconcini对于所描述的行为(应用程序进程被终止),对应的是
onCreate()
方法。否则,如果活动仅停止,则您是对的。看一看生命周期图,有一条向左和向右的路径。;)@Baschi好吧,你说得对,它可以走任何一条路,但前提是它被摧毁(这正在发生,最终也会发生)。哇..很好的答案和很好的解决方案,我现在明白了,并使用savedInstanceState来保存和恢复我的id。很高兴看到这种精巧的设计,很多人都喜欢:)很高兴看到它有所帮助。请小心使用savedInstanceState。该捆绑包仅用于在活动或片段的生命周期中临时保存状态,而不是作为永久存储解决方案。请阅读此堆栈溢出线程以获得一个想法:您可以看到Martin Belcher-Eigo在结尾处编写的一个非常好的解释