有关Android流程的三个问题。我正在开发一个应用程序。如果我声明服务在AndroidManifest.xml中的另一个进程中运行
<service android:name=".MyService" android:process=":MyProcess"/>
这是否意味着会有两个JVM实例,一个由MyService使用,另一个由其他代码使用?
如果上述问题的答案是肯定的,那么这是否意味着如果我有一个单独的类使用活动&amp; MyService,那么将为单例创建两个实例?
如何确保只创建一个实例&amp;然后由两个进程共享?更好地提供样本:)
==== UPDATE ====
感谢您的所有评论和答案,遗憾的是,我的项目需要使用单独的服务流程,因为它具有长时间运行的后台任务。根据你的回复,我有第四个问题:
如果我需要在MyService
进程和其他代码的进程中传递不可分区的对象。可能吗?如何?
答案 0 :(得分:5)
是的(以某种方式,但不完全是,它是一个dalvik VM,或者是Lollipop ART),但是,你有两个独立的东西来运行服务和其他代码。
- 这是否意味着会有两个JVM实例,一个由MyService使用,另一个由其他代码使用?
醇>
- 如果上述问题的答案是肯定的,那么这是否也意味着如果我有一个单独的类使用活动&amp;我的服务,然后那里 将是为单身人士创建的两个实例吗?
醇>
是
你不能!您刚刚告诉系统有单独的进程。所以它不能有“相同”的单身。
- 如何确保只创建一个实例&amp;然后由两个进程共享?更好地提供样本:)
醇>
一种方法是让你的服务实现一个binder或AIDL(如果你要直接调用方法)或实现一个ContentProvider,它可以在你可以从中读取值的进程中相同。
或者你可以让它变得更简单,而不是使用这个过程。不建议使用99.9%的用例android:process
。因此,重新评估您的软件。你真的需要吗?
修改强>
不幸的是,我的项目需要使用单独的服务流程 有长期运行的后台任务
如果您的项目需要长时间运行的后台任务,那么您肯定需要Service
。但这并不意味着它需要处于一个单独的过程中。您项目中的所有活动都可以转到后台并进行垃圾回收,您的服务仍可正常运行。它将继续在活动运行的同一进程上运行,但服务和单例仍然存在。请记住return START_STICKY
。
如果你仍然认为你需要在一个单独的过程中使用它(我认为你不需要)。然后你需要实现一个绑定服务(或者可能是AIDL,我不确定绑定服务是否可以跨进程工作),将活动连接到它并使用常规方法(如public void takeThisObJect(Object reference);
)提供对象的引用p>
指向绑定和AIDL服务指南的链接:
http://developer.android.com/guide/components/bound-services.html http://developer.android.com/guide/components/aidl.html