我正在开发 2 个应用程序,它们将在单独的进程中运行,并且像客户端-服务器通过 Android 的Messenger
IPC 介质进行通信一样。
应用程序A(服务器应用程序)建立了一个Bound Service
,该可由客户端应用程序 B 在外部显式启动,以请求连接和执行某些操作。
应用程序 B 是客户端应用程序,它建立了自己的Bound Service
- 显式启动并保持与应用程序 ABound Service
的联系 - 该Application
级别绑定并由不同的Activities
交互,通过其Handler
实例为后者提供反馈。
在某些情况下,App A 的Bound Service
需要触发一系列专门编写脚本的Activity
启动,以便在应用程序 B 的Bound Service
轮询后为其服务器功能正常运行建立必要的要求。但是,一旦设置了它们,我需要将应用 B 带回前台,以便用户与之交互。
在该特定应用程序 A 的活动中,我onBackPressed()
实现moveTaskToBack(true)
以防止用户默认意外关闭应用程序,并打算简单地调用onBackPressed()
以在以上述方式启动时显示应用程序 B 的任务。
但是,即使应用程序 B 已Activities
运行,并且在应用程序 B 的Service
调用应用程序 A 的Service
时处于前台,这反过来又将应用程序 A 的Activities
启动到前台,从应用程序 A 的Activity
调用onBackPressed()
会将用户直接发送回主屏幕,绕过应用程序 B。
如何简单地告诉应用 A 将自身发送到后台并显示应用 B,而不将应用 B 也发送到后台?为什么moveTaskToBack()
把其他任务也移到后面?
因此,我还没有找到通知应用程序 A 将自身而不是启动它的任务(应用程序 B)发送到后台的确切方式,但我找到了一种方法来简单地告诉应用程序 A 将应用程序 B 发送到它前面,这对我有用。
通过跨越两个绑定服务的信使,我发送应用程序B的taskID
,从其任何Activities
获得的getTaskID()
,方法是将其传递到捆绑包中,该捆绑包是我通过信使实例发送的消息msg.obj
。
然后,通过携带捆绑包通过应用程序 A 中启动后续活动的所有链接意图,我可以访问应用程序 A 中目标Activity
中的taskID
,并使用
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
activityManager.moveTaskToFront(taskID, ActivityManager.MOVE_TASK_WITH_HOME);
改为将应用 B 发送到前台。当按下应用程序B的Activity
时(onBackPressed()没有在那里被覆盖),我发现自己回到了应用程序A,这对于MOVE_TASK_WITH_HOME
标志来说似乎很奇怪,但这对我来说并不麻烦。
但是,我仍然对原始问题的答案持开放态度,如果有的话,我会将其设置为正确答案。