当您进入某个活动时(我们将其称为A),然后您调用后续活动(B),可能是因为单击A中的按钮,然后返回到该先前的Activity A,通过单击Back按钮或从B中显式调用finish(),它会导致A完全重建,调用其构造函数及其OnCreate()方法等。
有没有办法防止这种情况发生,以便它实际上确实返回到先前已经存在的活动A?
答案 0 :(得分:3)
如果我错了,请纠正我,但不应该在onCreate()
打电话给我,而不是简单化,但我们说活动的管理方式就像一个简单的堆栈,我们称之为AppStack
当调用活动A的onCreate()
时,操作系统将活动实例推送到AppStack
________ _________________
Activity|
___A____|_________________
当您单击活动A上的按钮时,它会向活动B启动新意图
Intent actB = new Intent(this, ActivityB.class);
然后将活动A置于Stopped
州
当调用活动B onCreate()
时,操作系统会将该活动实例推送到AppStack上
________ __________________
Activity|Activity|
___A____|___B____|_________
现在,如果您在活动B中调用finish()
或super.onBackPressed()
,操作系统将pop()
来自AppStack的活动
________ __________________
Activity|
___A____|__________________
当操作系统返回上一个活动时,它会看到它是Stopped
并开始Resuming it
到onResume()
的过程。
现在,如果您需要持久化某些数据,可以通过覆盖onResume()
查看活动生命周期文档,了解更多信息:
答案 1 :(得分:1)
这是设计:
如果活动暂停或停止,系统可以通过要求完成(调用其finish()方法)或简单地终止其进程来从内存中删除它。当活动再次打开时(在完成或杀死之后),必须全部创建它。
见Activity Lifecycle。这也是Service类存在的原因:
服务是一种应用程序组件,可以在后台执行长时间运行的操作,但不提供用户界面。另一个应用程序组件可以启动服务,即使用户切换到另一个应用程序,它也将继续在后台运行。
答案 2 :(得分:1)
这不是一个典型的场景,但是当回到该活动时调用onCreate()
意味着Android OS会在后台杀死它。
原因: Android正在经历一些内存短缺,因此必须完成一些后台任务。
有没有办法阻止这种情况发生?
不,你无法控制它,有很多原因导致内存不足。安装了其他应用程序,某些设备消耗的电量超出预期。 虽然,您可以通过将当前信息存储在onSaveInstanceState()
并从{{1}恢复值来处理此用例}}
答案 3 :(得分:1)