Launcher Activity 未从最近的应用程序启动

Posted

技术标签:

【中文标题】Launcher Activity 未从最近的应用程序启动【英文标题】:Launcher Activity not launched from recent Apps 【发布时间】:2015-01-31 19:09:11 【问题描述】:

假设有两个活动: 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 退出(或从 Application 退出)。有 2 个选项,从哪里启动应用程序: 1. 从启动器图标 2.从最近的应用程序

现在,如果应用程序从 launcher icon 启动,那么 Activity A 就会启动。但是如果应用程序是从 Recent Apps 启动的,那么 Activity B 就会启动。


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

【问题讨论】:

简单的答案:你不能。这是一个 Android 设计,*** 中有几个关于这个问题的问题和答案。有一些奇怪的解决方案,但它们都不是真正始终有效或 100% API 符合。 我认为您无需任何输入即可直接从 Activity A 启动 Activity B,并且还关闭了 Activity A,因此当您从最近启动应用程序时,它可能看起来像 Activity B 将直接显示而不是 Activity A。 另一种解决方案是使用片段,在 onCreate() 中设置您的默认片段。 【参考方案1】:

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

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

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

【讨论】:

我不能使用这个标签“clearTaskOnLaunch”,每次我重新启动应用程序时,它都会删除所有的后台活动。我只需要处理最近应用程序的案例。谢谢回复:) 它不工作...我有两个活动 A 和 B...我从推送通知启动了活动 A(不是我的启动器活动),然后我从那里转到活动 B 并完成活动 A然后我支持活动 A。应用程序退出了,因为活动 A 已经完成。当用户从最近的任务活动 B 打开应用程序时,但我已经支持活动 B,因此活动中不应该有任何活动,因此我的启动屏幕应该打开......帮助我【参考方案2】:

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

android:excludeFromRecents

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

编辑

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

android:taskAffinity

Activity 与其有关联的任务。与活动 相同的亲和力在概念上属于相同的任务(属于相同的 “应用程序”从用户的角度)。任务的亲和力是 由其根活动的亲和力决定。

亲和力决定了两件事——活动的任务 重新设置为(参见 allowTaskReparenting 属性)和任务 当它与 FLAG_ACTIVITY_NEW_TASK 标志。

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

如果没有设置这个属性,activity会继承affinity set 对于应用程序(请参阅元素的 taskAffinity 属性)。应用程序的默认关联名称是 元素设置的包名。

【讨论】:

这不是完美的解决方案,因为我正在从最近的应用程序中删除该应用程序。我也可以用来标记其他活动。另外我不使用片段,我想保持我的代码简洁明了。谢谢回复:)

以上是关于Launcher Activity 未从最近的应用程序启动的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )

错误记录Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )

Error处理: 重提No Launcher activity found!

Android 中应用程序Activity的冷启动流程

学墨香Launcher之

在某些设备中从最近的应用程序中滑动应用程序时,未从 Google 功能接收到推送通知