在主屏幕顶部的 Activity 上调用 movetasktoback 方法不会将主屏幕带到前台

Posted

技术标签:

【中文标题】在主屏幕顶部的 Activity 上调用 movetasktoback 方法不会将主屏幕带到前台【英文标题】:Calling movetasktoback method on an Activity on top of home screen does not bring Home screen to foreground 【发布时间】:2015-04-06 04:50:03 【问题描述】:

我有一个启动模式为单任务的活动。该活动由广播接收器使用意图标志 Intent.FLAG_ACTIVITY_NEW_TASK 启动。如果此活动位于主屏幕顶部,并且如果我从此活动调用 moveTasktoBack(true),我希望显示主屏幕而不是主屏幕,来自另一个任务的活动 B 被带到前面。操作顺序如下。

任务 B 中的活动 B -> [按主页按钮] -> 主屏幕 -> 通过广播接收器启动活动 A -> 活动 A 调用 moveTaskToBack(true) -> 任务 B 中的活动 B 进入前台。

我检查了任务 A(带有活动 A)和任务 B(带有活动 B)的任务关联性,它们是不同的。

我如何确保在这种情况下,当 Activity 自身移动到堆栈后部时会显示主屏幕。

【问题讨论】:

【参考方案1】:

不要将您的任务移至后台,只需像这样启动主屏幕:

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

【讨论】:

我不能总是这样做,因为我的用例需要在 Activity A 在 Activity B 之上启动并调用 Activity A 调用 movetasktoBack 的情况下弹出 Activity B。在这种情况下,Activity B 可以来自任何应用程序,并且在大多数情况下不会与 Activity A 属于同一任务。 您的评论毫无意义。此代码完成与调用moveTaskToBack() 相同的事情。它将调用Activity 所在的任务移动到后台并向用户显示主屏幕。这正是你说你想做的。我不明白你的抱怨。请试试这个,然后告诉我什么不能按你想要的方式工作。 我想在 AOSP 中遇到了以下错误。 gitorious.org/cyandreamproject/android_frameworks_base/commit/… 我们有一个定制的设备,我们 fork Android 放在我们的设备上。我们的 Android 可能没有此修复程序。正如我所说,如果我在不同的活动之上,我并不总是想回到主屏幕。在我的场景中,虽然我在主屏幕顶部,但在调用函数 moveTasktoback 时,不会显示主屏幕,但如果我在任何其他活动之上,事情就会按预期工作。 您在问题中写了 ...with launch mode as Single Task。由于您的Activity 是以singleTask 启动的,因此它不能在另一个Activity 之上启动。它永远是新任务的根源。在这种情况下,我的代码应该做你想做的事。但是,如果存在导致不良行为的 Android 错误...【参考方案2】:

在尝试使用堆栈中的更多活动(来自不同应用程序)和自动情况(即以编程方式接收广播事件时)执行 moveTaskToBack (true) 时,我遇到了自己的问题。我不确定确切的原因是什么。但是我使用核选项解决了它们:我没有尝试将活动/任务移回,而是使用完成()将其杀死。它运作良好,在我想的所有情况下。可能会减慢速度,因此请谨慎使用,但就我而言,它解决了问题。而且,当然,您需要保存所有相关的状态信息并恢复它。在我的情况下,这不是一个大问题。

【讨论】:

以上是关于在主屏幕顶部的 Activity 上调用 movetasktoback 方法不会将主屏幕带到前台的主要内容,如果未能解决你的问题,请参考以下文章

将应用小部件放置在 Activity 之外的主屏幕上

在Android N多窗口模式下按下主页按钮时未调用Activity onStop()

将蓝牙连接传递给新的 Activity

Android 任务栈

区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity

如何从 HomeScreen Widget 调用 Activity 中的函数