1

假设有两个活动:
1.活动A(启动器活动)
2.活动B


Activity A启动Activity B时,我完成了Activity A

startActivity(new Intent(A.this, B.class));
finish();

如果从Activity B单击退出按钮,则Activity B完成。

ExitButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                finish();
            }
        });

所以,假设Activity BActivity A启动,我从Activity B退出(或从应用程序退出)。有 2 个选项,从哪里启动应用程序:
1. 从启动器图标
2. 从最近的应用程序

现在,如果应用程序从启动器图标启动,则启动Activity A。但是如果应用程序是从最近的应用程序启动的,那么Activity B就会启动。


我认为,即使我为它调用了finish() , Activity B仍保留在堆栈中。 我的问题是:当应用程序退出时,如何清除堆栈?在Android 2.3.6版本测试

4

2 回答 2

2

您可以在 AndroidManifest.xml 文件中为您的 MainActivity 设置 android:clearTaskOnLaunch="true" 属性。我认为这是满足您需求的最便捷方式。

我刚刚测试并发现这仅在您退出应用程序并从应用程序抽屉启动应用程序时才有效(不要长按 HOME 并选择应用程序)。

如果您想始终将根 Activity 置于最前面,无论您何时重新启动应用程序或从最近的屏幕启动。您可以为根活动声明“android:launchMode="singleTask”,这里是 MainActivity。

于 2014-12-03T09:51:25.537 回答
1

除了我上面提到的使用片段的解决方案之外,您还可以尝试android:excludeFromRecents在 AndroidManifest 中为您的活动编写

android:excludeFromRecents

此活动启动的任务是否应从最近使用的应用程序列表中排除,概览屏幕。也就是说,当这个activity是一个新任务的根activity时,这个属性决定了这个task是否不应该出现在最近的应用列表中。如果该任务应从列表中排除,则设置为“true”;如果应该包含它,则设置为“false”。默认值为“假”

编辑

如果您遵循上述操作,则您的 MainActivity 也可能会从最近的活动中消失,因为默认情况下,应用程序的所有活动都具有相同的亲和力android:taskAffinity。要指定文档所说的不同任务用途

android:taskAffinity

Activity 具有亲和力的任务。具有相同亲和力的活动在概念上属于同一个任务(从用户的角度来看,属于同一个“应用程序”)。任务的亲和性由其根活动的亲和性决定。

亲和性决定了两件事——Activity 被重新设置为父级的任务(请参阅allowTaskReparenting 属性)和使用 FLAG_ACTIVITY_NEW_TASK 标志启动时将容纳 Activity 的任务。

默认情况下,应用程序中的所有活动都具有相同的亲和性。您可以设置此属性以对它们进行不同的分组,甚至可以将不同应用程序中定义的活动放在同一个任务中。要指定活动与任何任务没有关联,请将其设置为空字符串。

如果未设置此属性,则活动继承为应用程序设置的亲和性(请参阅元素的 taskAffinity 属性)。应用程序的默认关联名称是元素设置的包名称。

于 2014-12-03T09:47:19.353 回答