如何解决如果我的应用程序在后台运行,为什么Android OS不会为singleTop活动创建新实例?
我的应用有两个活动:A和B。A-是主要活动(默认为启动),它具有操作android.intent.action.MAIN
和类别android.intent.category.LAUNCHER
,并且A活动已覆盖{{1} },这意味着如果我们尝试启动活动A并且A不在任务的顶部,那么OS将创建一个新的A实例并将其放在顶部。
步骤:
- 从应用程序菜单中启动活动A(单击应用程序图标)
- 单击活动A屏幕中的按钮以启动B(现在活动堆栈看起来像A-> B)
- 按下主屏幕按钮再次查看应用程序菜单并最小化应用程序
- 再次单击应用程序图标以启动我的应用程序
结果:打开的活动B(堆栈看起来像A-> B)
所以我的问题是,如果我的带有任务堆栈的后台应用程序看起来像A-> B(B放在顶部,A和B尚未完成,它们处于onStop状态),为什么OS不会创建A的新实例,并且只需在应用程序菜单上点击应用程序图标时打开当前堆栈(该点击会以启动器的意图将意图发送到我的应用程序,并且在具有启动模式singletop的活动A中描述了启动器)
我认为这是因为A具有lanchMode="singletop"
,因此可以打开A的新实例(具有堆栈A-> B-> A)。似乎该应用程序在后台处于活动状态(处于lanchMode="singletop"
状态,并且其打开意图与第一次相同,那么Android OS仅显示当前应用程序任务,但是我找不到任何证明那。
解决方法
此行为实际上与Activity
的启动模式无关。实际上,在这种情况下,Android不会启动任何Activity
。如果您添加了日志记录或在onNewIntent()
处设置了一个断点,则会看到此消息,在Android要启动Activity
的情况下会调用该断点,因为看到该实例已经在堆栈的顶部任务,然后通过调用Intent
将新的onNewIntent()
路由到当前实例。
当用户点击HOME屏幕上的应用程序图标时,这里发生的事情是,在启动任何Activity
之前,Android会查看在后台是否已经有以此启动的任务相同的Intent
(在这种情况下,ACTION = MAIN,CATEGORY = LAUNCHER,COMPONENT = ActivityA)。如果找到以相同的Intent
开始的任务,它只会将该任务以其处于任何状态(确切地说是移至背景时的状态)带到前台。它不会启动任何新的Activity
,也不会在最顶部的onNewIntent()
上调用Activity
。
here(尽管很容易错过)记录在案:它写着:
设备主屏幕是大多数任务的起点。当。。。的时候 用户触摸应用启动器中的图标(或“主页”上的快捷方式 屏幕上),该应用程序的任务就变成了前台。如果没有任务 对于该应用程序(该应用程序最近未使用),则需要执行一项新任务 创建后,该应用的“主”活动将以根身份打开 活动。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。