重新打开已杀死的应用程序后,打开先前的活动。

3
我的应用历史记录很正常;当我启动意图时,我没有使用任何花哨的标志或其他东西。只有按顺序、单任务启动的活动。如果我回到主屏幕,然后使用任务管理器杀死我的应用程序,下一次打开应用程序时,它会从最后一个被杀死之前所在的活动开始而不是声明的主要活动。此外,如果我再次打开应用程序并按返回键退出应用程序,然后重新打开它,我会得到在上一次被杀死之前打开的活动。

类似这样:

A = 主要活动;B = 其他活动;C = 其他活动

  • 打开应用程序 - A
  • 打开B - B
  • 打开C - C
  • 使用任务管理器杀死应用程序
  • 打开应用程序 - C
  • 返回键 - 设备主屏幕
  • 打开应用程序 - B
  • 返回键 - 设备主屏幕
  • 打开应用程序 - A

我希望在任务杀死后不会记住后台堆栈。我希望应用程序始终从声明的主要活动开始,除非它已经在后台运行。(这里不是这种情况,因为使用了kill)然而,这两件事似乎都没有发生,我不知道为什么。

我尝试在我的Application类中设置一个"initialized"布尔值,在A的onCreate中进行检查,在BC的onCreate中进行检查。这个想法是使用NEW_TASK和CLEAR_TOP标志启动A的意图,以尝试检测和纠正这种情况,但它仍然表现出完全相同的行为,除了还会把A放在剩下的所有活动之上。所以,它不是把应用程序启动到B,而是把应用程序启动到BA

基于我所读过的关于活动生命周期和操作系统杀死应用程序的所有内容,这是不可能的,但它确实在我所有的测试设备上发生。有没有人有任何想法,可以解释这种奇怪的行为?


当用户从主屏幕启动您的应用程序时,您是否想要启动活动A? - Hoan Nguyen
那是我的目标,没错。 - Dave
你能够实现它的唯一方式是复杂的,而且根据你的应用程序任务堆栈大小,你会看到很多闪烁。 - Hoan Nguyen
请发布您的清单。 - David Wasser
@Dave 在我回答之前,我想知道你的应用程序中是否将android:alwaysRetainTaskState设置为true? - Imtiyaz Khalani
2个回答

4

您的应用程序表现正常。这是默认行为。当其他应用程序需要资源时,Android会在后台杀死应用程序。当用户返回原始应用程序时,他期望返回到与离开时相同的状态,因此Android记住状态并恢复它。这是标准的、默认的用户期望行为。

如果您不想要这种行为,您应该添加

android:clearTaskOnLaunch="true"

为您根Activity(具有ACTION=MAIN和CATEGORY=LAUNCHER)的清单声明中添加<activity>标签。这将导致Android在用户从HOME屏幕返回到应用程序时从头开始启动应用程序。

如果您还不希望用户从“最近任务”屏幕启动应用程序时返回到应用程序的先前状态,则需要添加:

android:excludeFromRecents="true"

将此内容添加到您的根Activity<activity>声明中。这将防止Android将您的应用程序添加到最近任务列表中,因此用户无法从“最近任务”屏幕返回到您的应用程序。

3
我认为你的应用没有任何问题。大多数任务管理器只是在所选应用上调用restartPackage(),这会导致调用savedInstanceState(),因此您的应用程序保存其状态。这使得它更有可能从内存中启动,但仅当Android需要内存时才会发生。基本上,“任务管理器”应用程序不会杀死任何东西。
根据ActivityManager文档,restartPackage()与killBackgroundProcesses()相同,后者执行以下操作:“这与内核终止那些进程以回收内存相同;系统将在未来根据需要重新启动这些进程。”

如果我也从Eclipse终止应用程序,这种情况也会发生,公平地说,我不知道IDE如何执行“终止”功能。是否有可能强制应用程序始终从正确的主要活动开始? - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接