我的主要活动A已经android:launchMode="singleTask"在清单中设置了.现在,每当我从那里开始另一个活动,例如B并按下HOME BUTTON手机上的电话返回到主屏幕,然后再次返回我的应用程序,可以通过按应用程序的按钮或按下HOME BUTTON长按来显示我最近的应用程序不保留我的活动堆栈并直接返回A而不是预期的活动B.
这里有两个行为:
Expected: A > B > HOME > B
Actual: A > B > HOME > A (bad!)
Run Code Online (Sandbox Code Playgroud)
有没有我缺少的设置或这是一个错误?如果是后者,在修复错误之前是否有解决方法?
我正在(最后)编写关于我书的任务的章节,我遇到了一些挥之不去的谜题.
作为主屏幕发射器的东西似乎使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED启动请求的启动器活动时的组合:
Intent i=new Intent(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
i.setComponent(name);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)
文档FLAG_ACTIVITY_RESET_TASK_IF_NEEDED包含:
如果设置,并且此活动要么在新任务中启动,要么将现有任务置于顶部,那么它将作为任务的前门启动.这将导致应用任务所需的任何关联性,以使该任务处于适当的状态(将活动移入或移出),或者仅在需要时将该任务重置为其初始状态.
那不是特别清楚.
特别是,它似乎是相同的效果将使用的组合可以看出FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP.引用文档FLAG_ACTIVITY_CLEAR_TOP:
如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为一个新的意图......
当前运行的[所需活动]实例将在其onNewIntent()方法中接收您从此处开始的新意图,或者本身已完成并使用新意图重新启动.如果它已将其启动模式声明为"多个"(默认值)并且您没有在同一意图中设置FLAG_ACTIVITY_SINGLE_TOP,那么它将被完成并重新创建; 对于所有其他启动模式或如果设置了FLAG_ACTIVITY_SINGLE_TOP,则此Intent将被传递到当前实例的onNewIntent().
该FLAG_ACTIVITY_CLEAR_TOP文档是有道理的,至少对我来说.
那么,这FLAG_ACTIVITY_RESET_TASK_IF_NEEDED与FLAG_ACTIVITY_CLEAR_TOPand 的组合FLAG_ACTIVITY_SINGLE_TOP有何不同?
如果您可以解释FLAG_ACTIVITY_CLEAR_TASK与上述其他两个选项中的任何一个不同的加分点.
如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务.也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成.这只能与FLAG_ACTIVITY_NEW_TASK一起使用.
这和FLAG_ACTIVITY_CLEAR_TOP| 之间有一个明显的区别 FLAG_ACTIVITY_SINGLE_TOP是FLAG_ACTIVITY_CLEAR_TASK需要的FLAG_ACTIVITY_NEW_TASK.但是,除此之外,看起来净效果是相同的,也是匹配的FLAG_ACTIVITY_RESET_TASK_IF_NEEDED.