【问题标题】:Android moveTaskToBack also hides Applications that launched calling ApplicationAndroid moveTaskToBack 还隐藏了启动调用应用程序的应用程序
【发布时间】:2018-02-11 14:59:53
【问题描述】:

我正在开发 2 个应用程序,它们将在单独的进程中运行,并像客户端-服务器一样通过 Android 的 Messenger IPC 介质进行通信。

服务端应用程序 A 建立一个Bound Service,客户端应用程序应用程序 B 可以在外部显式启动该Bound Service,以请求连接并执行一些操作。

App B,客户端应用程序,建立它自己的Bound Service - 显式启动并保持与 App A 的 Bound Service 的联系 - 绑定在 Application 级别并与不同的 Activities 交互,给出后者通过他们的Handler 实例进行反馈。

在某些情况下,应用 A 的 Bound Service 在被应用 B 的 Bound Service 轮询后,需要触发一系列 Activity 启动,这些启动经过专门脚本确定其服务器功能正常工作的必要条件。但是,一旦它们设置完毕,我需要将 App B 带回前台以便用户与之交互。

在那个特定的 App A 的 Activity 中,我在 onBackPressed() 中实现了 moveTaskToBack(true),以防止用户在默认情况下意外关闭应用程序,并打算简单地调用 onBackPressed() 以显示 App B 在上述启动时的任务方式。

然而,即使 App B 有 Activities 正在运行并且在 App B 的 Service 调用 App A 的 Service 时处于前台,这反过来又将 App A 的 Activities 启动到前台,从调用 onBackPressed()应用 A 的 Activity 绕过应用 B,将用户直接送回主屏幕。

我如何简单地告诉 App A 将自己发送到后台并显示 App B,而不将 App B 也发送到后台?为什么moveTaskToBack() 也将所有其他任务都移到后面?

【问题讨论】:

    标签: android android-activity service


    【解决方案1】:

    所以,我还没有找到通知 App A 将自己发送到后台的确切方式,而不是启动它的任务(App B)到后台,但我找到了一种方法来简单地告诉 App A 发送 App B 在它前面,这对我有用。

    通过跨越两个绑定服务的 Messenger,我发送 App B 的 taskID,从它的任何 ActivitiesgetTaskID(),通过将它传递到一个 Bundle 中,这是我通过Messenger 实例。

    然后,通过在App A中启动后续Activity的所有链式Intent携带Bundle,我可以访问App A中目标Activity中的taskID,并使用

    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    activityManager.moveTaskToFront(taskID, ActivityManager.MOVE_TASK_WITH_HOME);
    

    改为将 App B 发送到前台。当在 App B 的 Activity 上按下返回时(onBackPressed() 没有在那里被覆盖),我发现自己又回到了 App A 上,这对于 MOVE_TASK_WITH_HOME 标志来说似乎很奇怪,但这对我来说并没有太大的麻烦。

    我仍然愿意接受原始问题的答案,但如果有任何答案,我会将其设置为正确答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      相关资源
      最近更新 更多