如果我的应用程序在后台运行,为什么Android OS不会为singleTop活动创建新实例?

如何解决如果我的应用程序在后台运行,为什么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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?