Android 中的进程和单例
processes & singleton in Android
关于Android中流程的三个问题。我正在开发一个应用程序。如果我在 AndroidManifest.xml
中的另一个进程中将服务声明为 运行
<service android:name=".MyService" android:process=":MyProcess"/>
是否意味着会有两个 JVM 实例,一个被 MyService 使用,另一个被其他代码使用?
如果上述问题的答案是肯定的,那么是否也意味着如果我有一个单例 class 同时被 Activity 和 MyService 使用,那么会有两个为单例创建的实例?
如何保证两个进程只创建并共享一个实例呢?最好提供一个例子:)
====更新====
感谢您的所有评论和回答,不幸的是,我的项目需要使用单独的服务进程,因为它有很长的 运行 后台任务。根据大家的回复,我有第四个问题:
如果我需要跨 MyService
进程和其他代码的进程传递 不可分包的 对象。可能吗?如何?
- 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 中),但是,是的,你有两个独立的东西 运行 服务和其余代码。
- 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?
是
- 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
关于Android中流程的三个问题。我正在开发一个应用程序。如果我在 AndroidManifest.xml
中的另一个进程中将服务声明为 运行<service android:name=".MyService" android:process=":MyProcess"/>
是否意味着会有两个 JVM 实例,一个被 MyService 使用,另一个被其他代码使用?
如果上述问题的答案是肯定的,那么是否也意味着如果我有一个单例 class 同时被 Activity 和 MyService 使用,那么会有两个为单例创建的实例?
如何保证两个进程只创建并共享一个实例呢?最好提供一个例子:)
====更新====
感谢您的所有评论和回答,不幸的是,我的项目需要使用单独的服务进程,因为它有很长的 运行 后台任务。根据大家的回复,我有第四个问题:
如果我需要跨 MyService
进程和其他代码的进程传递 不可分包的 对象。可能吗?如何?
- 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 中),但是,是的,你有两个独立的东西 运行 服务和其余代码。
- 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?
是
- 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