我有一个离线在线应用程序,我发现它有一个奇怪的问题,可能不是,但我不明白它..
应用程序要求是,如果互联网可用,即使从启动应用程序或从恢复,我调用webservices并在sqlite中存储数据,否则应用程序保持在离线模式,
我有2个活动,第二个活动包含一个id,我通过意图(这一点很重要),
我的问题:
如果我在第二个活动,互联网正在运行,我按下主页按钮,然后第二个活动暂停,然后停止这是Android中的默认行为,我转到设置,关闭wifi,然后按应用程序图标< / strong>再次回到我的应用程序,这里我感到困惑,我希望我的应用程序现在将在 onResume ,但是当我在logcat中看到它的 onCreated 时和应用程序
崩溃,发生nullPointerException,因为这个第二个活动没有那个id,我通过了意图..
注意:
如果我使用最近的应用程序按钮进入“设置”,然后在turing wifi关闭后再次返回,并重复所有这些行为,然后正常工作,其onResumes称为oncreate ..
我的问题
当我从应用程序图标回来时,我的期望是onResume,为什么它会进入onCreate?
答案 0 :(得分:2)
NPE原因很清楚,你的第二项活动没有价值而且崩溃了。
为什么你会有不同的行为!?
这是因为发射意图不同。当您“任务切换”时,Android只是停止您的应用程序,但将其保留在那里(无保证),以防您想要切换回来。
回家(带回家)清楚地表明你想要离开应用程序,虽然它会保留在内存中并缓存(只要有可用的内存),然后通过启动器返回(或者应用程序图标为你叫它)激发LAUNCHER类别(首先进入你的活动1)。
查看this StackOverflow问题(和答案)以更好地了解后果。
在任何情况下,您的问题都是您的应用必须始终设计为以不一致的状态恢复并且能够恢复。 Android 会终止您的参考,会破坏您的变量,并且很可能会在一夜之间将您的应用发送到地狱 ...即使您正在运行...如果是手机进入待机状态,没有做任何事情的进程可能会被暂停/停止并可能被杀死。
重新设计您的应用,这不是问题。
你说:
“我有2个活动,第二个活动包含一个id,我通过了 通过意图(这一点很重要),“
那么,为什么不让它变得更容易并且有一个活动和两个片段?然后使用Fragment Arguments传递值?
或者为什么不将值存储在首选项和/或本地数据库中并在onCreate期间恢复它?
为什么不这样做,如果Activity 2没有值,它会调用Activity 1并自行关闭(比崩溃更好,是吗?)。
等
正如您所看到的,您应该考虑多种因素。总而言之,从不相信您的应用会活着,因为它不会。
答案 1 :(得分:1)
您声明如果进入设置,您可以看到活动已停止(onStop)。这是Android活动生命周期中显示的行为。 onStop的对应物是onCreate。所以它完成了文档告诉我们的内容。如果它们以某种方式可见,则暂停活动,如果它们不再可见则停止。这可以解释您的活动暂停的原因。有关详细信息,请阅读Managing the Activity Lifecycle。您可以找到生命周期的整个图片here。
答案 2 :(得分:1)
当您更改某些系统配置(如字体类型,字体大小或语言)时,可以看到此类行为。但打开/关闭wifi不会破坏应用程序并再次重新创建它。查看http://developer.android.com/guide/topics/manifest/activity-element.html#config了解详情
答案 3 :(得分:1)
一旦你的活动的onStop被调用它很容易被android系统杀死以收集其他应用程序的资源,这就是我认为在你的情况下发生的事情。如果它被杀死,当你回到它时,android显然会调用OnCreate活动。检查this以获得澄清。要进行试验,您可以尝试从最近的应用中打开多个应用,然后返回到您的应用。它现在也可能在那里崩溃。