如果在 Android 中不再可见,系统会终止 Activity 的问题

Posted

技术标签:

【中文标题】如果在 Android 中不再可见,系统会终止 Activity 的问题【英文标题】:Issue with Activity killed by System if No Longer Visible in Android 【发布时间】:2012-07-24 19:32:51 【问题描述】:

我的应用程序中有活动(A、B、C)。当我启动应用程序时 活动 A:

  A:onCreate()
  A:onStart()
  A:onResume()

使用意图我正在调用第二个活动(A -> B):

  A:onPause()
  B:onCreate()
  B:onStart()
  B:onResume()
  A:onStop()

然后我点击“主页”按钮所以应用程序进入后台:现在

  B:onPause()
  B:onStop()

1 或 2 小时后,我再次转到设备中的主页并单击它运行的应用程序图标:

 B:onDestroy()
 A:onRestart()
 A:onStart()
 A:onResume()

但我需要像这样退出哪个活动,

B:onRestart()
B:onStart()
B:onResume()

我已经阅读了一些文章,它说该活动因不再可见而被系统杀死。有没有可能解决我的问题...

提前谢谢...

【问题讨论】:

你能发布你的活动A和B的代码吗? 【参考方案1】:

您可能在这里混淆了两个不同的东西:

    如果需要内存,android 不会杀死活动。它的作用是杀死 Activity 正在运行的整个进程。一般来说,这意味着 Android 在这种情况下会杀死你的 所有 Activity。但是,它会记住活动堆栈,当用户返回应用程序时,Android 将创建一个新进程,然后重新创建每个活动(依次根据需要)。它首先重新创建位于 Activity 堆栈顶部的 Activity(即:用户离开应用程序的位置)。

    Android 假设如果用户离开一个任务很长一段时间(我认为这大约是 30 分钟),那么他就不再对该任务感兴趣并且有记住用户在该任务的活动堆栈中的位置没有意义,因为他可能不再关心了。在这种情况下,发生的情况是当用户返回任务(或重新启动该任务中位于 Activity 堆栈顶部的应用程序)时,Android 只需将任务清除回根 Activity .其效果是应用程序看起来重新开始。这是期望的(和记录的行为)。

您想要做的是阻止 Android 清除情况 #2 中的任务。你通过添加来做到这一点

    android:alwaysRetainTaskState="true"

根活动<activity>标签(即:启动应用程序的活动,具有ACTION_MAINCATEGORY_LAUNCHER的活动)。

【讨论】:

【参考方案2】:

我不相信这是你肯定能控制的。如果您的 Activity 长时间处于后台,同时其他应用程序需要内存,系统将终止您的 Activity 以释放内存。

【讨论】:

是的,我知道安迪,但我的客户要求应该重启我退出的那个...但是有些应用程序像这样维护我不知道如何? 那我相信你应该考虑做一个自定义的实现。例如,每次打开活动 B 时,在 onCreate() 中在 SharedPreferences 中写入一个标志,然后在 onDestroy() 中删除该标志。现在,当活动 A 开始时,检查该标志的 SharedPreferences。如果设置了标志,这意味着活动 B 已打开但系统杀死了她(因为 id 没有通过 onDestroy() 删除标志),因此,将用户从那里重定向到活动 B。如果未设置标志,则什么也不做。这是一个想法...... 但这也是来自第二个活动的 onCreate() 所以它不会保留任何值。 Afaik,在文档中提到如果系统终止该活动,那么它将重新创建它。那么为什么我们需要自定义实现呢?

以上是关于如果在 Android 中不再可见,系统会终止 Activity 的问题的主要内容,如果未能解决你的问题,请参考以下文章

3. 管理 Activity 生命周期

Android:将可见设置为在运行时消失会留下一个空白空间

Android:manifest targetSdkVersion 更改导致:图标不可见,小部件不再工作,并且无法访问数据

Android - 如果绑定活动被终止,绑定服务会发生啥?

Android 多窗口支持:检测状态栏是不是可见?

即使在操作系统终止应用程序后,Android 活动仍保留在堆栈中