Android 中的进程和单例

processes & singleton in Android

关于Android中流程的三个问题。我正在开发一个应用程序。如果我在 AndroidManifest.xml

中的另一个进程中将服务声明为 运行
<service android:name=".MyService" android:process=":MyProcess"/>
  1. 是否意味着会有两个 JVM 实例,一个被 MyService 使用,另一个被其他代码使用?

  2. 如果上述问题的答案是肯定的,那么是否也意味着如果我有一个单例 class 同时被 Activity 和 MyService 使用,那么会有两个为单例创建的实例?

  3. 如何保证两个进程只创建并共享一个实例呢?最好提供一个例子:)

====更新====

感谢您的所有评论和回答,不幸的是,我的项目需要使用单独的服务进程,因为它有很长的 运行 后台任务。根据大家的回复,我有第四个问题:

如果我需要跨 MyService 进程和其他代码的进程传递 不可分包的 对象。可能吗?如何?

  1. Does it mean there will be two JVM instances , one used by MyService while the other one used by other code?

是的(在某种程度上,但不完全是,它是一个 dalvik VM,或者在 Lollipop ART 中),但是,是的,你有两个独立的东西 运行 服务和其余代码。

  1. If the answer of above question is YES, then does it also mean if I have a singleton class used by both Activity & MyService, then there will be two instances created for the singleton?

  1. How to ensure only one instance be created & shared by two processes then? Better provide a sample :)

你不能!您只是告诉系统有单独的进程。所以它不能有 "the same" 单例。

一种方法是让您的服务实现绑定器或 AIDL(以防您直接调用方法)或实现 ContentProvider,这在您可以从中读取值的进程中是相同的。

或者你可以让这一切变得更简单,而不是使用这个过程。不建议使用 99.9% 的用例 android:process。所以重新评估你的软件。你真的需要它吗?

编辑:

unfortunately, my project need to use separate service process as it has long running background tasks

如果您的项目需要很长的 运行 后台任务,您肯定需要 Service。但这并不意味着它需要在一个单独的过程中。您项目中的所有活动都可以进入后台并被垃圾收集,您的服务仍然可以正常运行。它将 运行 保持在与活动 运行 相同的进程中,但服务和单例仍然存在。请记住从中 return START_STICKY

如果您仍然认为需要在单独的进程中使用它(我认为您不需要)。然后你需要实现一个绑定服务(或者可能是 AIDL,我不确定绑定服务是否可以跨进程工作),将 activity 连接到它并使用像 [=13 这样的普通方法给出对象的引用=]

绑定和 AIDL 服务指南的链接:

http://developer.android.com/guide/components/bound-services.html http://developer.android.com/guide/components/aidl.html