服务在另一个进程中但与主应用程序在同一个 apk 中,它们可以轻松共享数据吗?

Service in another process but in same apk as main app, can they share data easily?

如果我在 apk 中有应用和服务。该服务虽然 运行 在另一个进程中而不是主应用程序,但在标签中使用 android:process=":SomeService" 属性 - 服务是否可以通过例如 LiveData 或 LocalBroadcastManager 将数据传播到主应用程序,这可以在程序的任何地方轻松传输,还是我必须使用一些基于 IPC 的机制,例如 Intents 或 .aidl 或其他什么。我希望你会说有一种简单的方法来共享数据,但我怀疑你会说因为它们处于不同的过程中所以没有简单的方法来做到这一点。我想避免使用 Intents 或 .aidl 或其他任何东西的所有开销......还应该说,我想要在另一个进程中提供服务有一个特殊的原因。

Can the service propagate data to the main app via for instance LiveData or LocalBroadcastManager which can be easily transmitted anywhere in a program, or do I have to use some IPC-based mechanism such as Intents or .aidl or whatever

因此,如果您为服务声明了 android:process,并且分配给该属性的名称以冒号 (':') 开头,则在需要时创建一个新进程,并且服务 运行s 在那个过程中。

您需要使用 AIDL 与此服务通信,因为就 Android 而言,这是另一个进程 & 在 Android 上,一个进程无法正常访问另一个进程的内存。

因此,为了相互交谈,他们需要将对象分解为操作系统可以理解的原语,并为您跨越该边界整理对象。

I am hoping you will say there is an easy way to share data but I suspect you are going to say that because they are in different processes there is no easy way to do it

嗯,这就是 android 流程模型的工作方式 - 恐怕还有其他人可以说出不同的东西

I would like to avoid all the overhead with Intents or .aidl or whatever... It should also be said that there is a special reason why I want the service in another process.

您有特定的理由 运行 另一个进程中的服务 - 这使得使用 AIDL 的理由更加充分,因为根据官方 android 文档,

Using AIDL is necessary if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service. If you do not need to perform concurrent IPC across different applications, you should create your interface by implementing a Binder or, if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger.

也许您可以考虑探索实施 Binder 或 Messenger - 如果这符合您的特定服务的实施细节。

在 2 个 OS 进程之间共享数据的唯一方法是 serialize/deserialize 在 OS 进程之间传输数据。

您可以为此使用 AIDL。

你也可以发送广播Intent(使用sendBroadcast())如果你想从Service发送数据到其他进程中的其他组件运行 .您不能使用 LocalBroadcastManager,因为 LocalBroadcastManager 不会在其自身的 OS 进程之外发送任何内容。请注意,发送广播 Intent 时可能会被读取 and/or 并被其他应用程序截获。

存在隐私和安全方面的考虑。