一个Android应用程序的活动在另一个进程中运行; `android:multiprocess`做什么?

时间:2013-09-16 16:05:31

标签: android android-activity multiprocess

大图

我有两个Android应用,HostGuest。我正在尝试从Guest运行活动,以便立即在Host中打开一个活动。目的是启动Guest应用程序应该在Host中运行,但似乎是以Guest运行(即,用户应该在所有意图和目的中不知道主持人的存在,尽管它为客人做了繁重的工作。)

这个问题是关于让Host活动在属于Host的流程中运行。

为什么我想这样做可能超出了这个问题的范围,但这绝对是我想要做的事情。)

我之前尝试过的事情

首先,人们认为与其他Host活动的流程分离就足够了。

为此,该过程在清单中的<activity>元素中命名。

<activity android:name=".MainHostActivity" android:process="host.process" />

出于两个原因,这被证明是有问题的:

  • 它有点工作,但面对多个客人,它变得非常黑客和凌乱。
  • 用于管理应用的标准Android工具不起作用(例如,从最近的应用列表中删除应用)。
  • 必须在编译时知道进程名称。

android:multiprocess

查看AndroidManifest.xml文档,我发现this activity attribute似乎有用:

  

android:multiprocess

     

是否可以将活动的实例启动到启动它的组件的进程中 - 如果可以的话true,如果不是false。默认值为false

     

通常,活动的新实例将启动到定义它的应用程序的进程中,因此活动的所有实例都在同一进程中运行。但是,如果此标志设置为true,则活动的实例可以在多个进程中运行,允许系统在任何使用它们的地方创建实例(只要权限允许),这几乎是不必要或不可取的。

我对此文档的阅读是这可能是我正在寻找的。我希望它说“活动 启动”而不是“活动可以启动”“进入启动它的组件的过程中。”

不幸的是,情况似乎并非如此。从Host启动Guest活动始终会以android.os.Process.myPid()衡量的不同流程结束。

我已经提出了一个pair of dummy applications,它应该显示我想要做的事情:

  • 安装Host
  • 安装并运行Guest
  • 启动的活动将有一个号码(来宾的pid)和三个按钮。单击前两个中的任何一个都应该启动第二个活动。第二个活动应显示与第一个活动相同的数字,true表示主机和来宾在同一个流程中运行。

不幸的是,情况似乎并非如此。

TL; DR

如何让来自不同活动的活动在调用者应用程序拥有的同一进程中运行?

android:multiprocess元素上的activity实际上做了什么?

修改: 我有一个minimal example应该显示我想要的东西。成功是指MainHostActivity显示与MainGuestActivity相同的数字。该号码为android.os.Process.myPid()

2 个答案:

答案 0 :(得分:0)

“android:process”和“android:taskAffinity”允许您在同一个包(应用程序)中拥有不同的进程和关联。

“android:multiprocess”仅表示您是否希望允许活动具有不同的进程ID。这仅适用于同一个应用程序,而不是在从不同的其他程序包启动活动时。

你到底想干什么?如果要共享相同的上下文和私有文件,则应使用sharedUserId(您必须使用相同的证书对它们进行签名)。

答案 1 :(得分:0)

尝试使用相同的证书对这两个应用进行签名。来自http://developer.android.com/guide/components/processes-and-threads.html

  

您还可以设置android:process,以便不同应用程序的组件在同一进程中运行 - 前提是应用程序共享相同的Linux用户ID并使用相同的证书进行签名。

如果您以后无法控制访客,则可能是SOOL