在我的应用程序中,我有以下结构:
活动A调用活动B,并完成,从堆栈中移除自身;活动B从活动A接收指示要执行的某个动作的意图,当执行这些动作时,用户将看到指示它的消息(仍在活动B中)。如果用户按下主页按钮,则应用程序将转到后台,调用"onPause"
然后调用"onStop"
。一切都按预期工作。
问题是,如果用户在后台离开应用程序几个小时,并尝试再次打开应用程序(几小时后),活动B中的onCreate
方法将被调用完全相同几个小时前从活动A收到的意图。
(如果用户在几分钟后回到应用程序,他会看到活动B,就像他离开时一样)
我想要的是,在这种情况下,我的应用会打开活动A,而不是活动B或活动B,但是当用户离开时,屏幕上会显示消息。
查看活动生命周期似乎应用程序正在被操作系统查杀,所有这些都是有道理的,我真正不理解的是为什么活动B以onCreate
方法打开并且意图与之前。
答案 0 :(得分:1)
这是Activity生命周期中描述的预期行为。
当活动开始时,它始终会收到Intent
个对象。当您的活动被杀死时,操作系统会保留用于启动活动B的意图,并在活动返回“活动”时重新发送。
您的活动会保持状态并根据需要恢复。根据您的问题说明,我建议您使用onStop()
,然后将活动状态和消息保存到SharedPreferences
,然后onResume()
将其读回。在onDestroy()
中,您应该清除首选项以确保新的清洁循环开始。
问候。
答案 1 :(得分:1)
我遇到了同样的问题,我不知道这样做的方式或权利,但我只是在需要时更改了Intent
Extra。
intent.putExtra(SEARCH_EXTRA, false);
setIntent(intent);
因此,您的活动不会执行操作,因为它没有收到它想要的内容。
答案 2 :(得分:1)
使用onSaveInstanceState()
记录ActivityB的状态。 Android会在杀死进程之前调用它。当用户返回应用程序时,它将重新创建该进程,然后重新创建活动堆栈顶部的任何活动(在您的情况下,ActivityB)。当它这样做时,它会将保存的实例状态作为onCreate()
调用中的参数传递给活动。您应该能够在其中放置一些内容,以便ActivityB可以在进程终止/重新启动后告知它正在重新创建。在这种情况下,ActivityB可以再次向用户显示消息(它必须在onSaveInstanceState()
方法中保存),或者它可以将用户重定向回ActivityA,以便他可以重新开始。