【问题标题】:One Android application's activity running in the process of another; what does `android:multiprocess` do?一个 Android 应用程序的 Activity 在另一个进程中运行; `android:multiprocess` 是做什么的?
【发布时间】:2013-09-16 16:05:30
【问题描述】:

大图

我有两个 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,则活动的实例可以在多个进程中运行,从而允许系统在使用它们的任何地方创建实例(只要权限允许),这几乎是不必要或不可取的。

我对本文档的阅读是,这可能是我正在寻找的。我更喜欢它说“活动启动”而不是“活动可以启动”“进入启动它的组件的进程”。

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

我已经提交了一个pair of dummy applications,它应该显示我正在尝试做的事情:

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

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

TL;DR

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

activity 元素上的android:multiprocess 实际上有什么作用?

编辑: 我有一个minimal example,它应该显示我想要什么。成功是MainHostActivity 显示与MainGuestActivity 相同的数字。号码是android.os.Process.myPid()

【问题讨论】:

  • 你不会,除非你有意并特别想抛弃 Android 的整个设计意图,并试图在幕后以艰难的方式强迫事情发生。 Android 建立在进程间通信的思想之上,这意味着 执行 的线程可以跨入另一个进程 并再次返回。
  • “其意图是启动 Guest 应用程序应该在 Host 中运行,但似乎是以 Guest 身份运行”——您可能希望解释一下“似乎是”的含义。
  • Guest 和 Host 是否使用相同的证书签名?
  • @FunkTheMonk - 没有。目前,我可以同时更改访客和主机。稍后,对 Guest 进行更改将更加困难。我可以随时更换主机。
  • 我强烈建议你放弃这个架构。

标签: android android-activity multiprocess


【解决方案1】:

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

"android:multiprocess" 仅表示您是否要允许活动具有不同的进程 ID。这仅适用于同一个应用程序,而不是当活动从不同的不同包启动时。

你到底想做什么?如果您想共享相同的上下文和私有文件,您应该使用 sharedUserId 代替(您也必须使用相同的证书对其进行签名)。

【讨论】:

    【解决方案2】:

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

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

    如果你以后不能控制客人,你可能是 SOOL

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多