流程& Android中的单身人士

时间:2015-02-24 10:13:27

标签: android singleton android-service

有关Android流程的三个问题。我正在开发一个应用程序。如果我声明服务在AndroidManifest.xml中的另一个进程中运行

<service android:name=".MyService" android:process=":MyProcess"/>
  1. 这是否意味着会有两个JVM实例,一个由MyService使用,另一个由其他代码使用?

  2. 如果上述问题的答案是肯定的,那么这是否意味着如果我有一个单独的类使用活动&amp; MyService,那么将为单例创建两个实例?

  3. 如何确保只创建一个实例&amp;然后由两个进程共享?更好地提供样本:)

  4. ==== UPDATE ====

    感谢您的所有评论和答案,遗憾的是,我的项目需要使用单独的服务流程,因为它具有长时间运行的后台任务。根据你的回复,我有第四个问题:

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

1 个答案:

答案 0 :(得分:5)

  
      
  1. 这是否意味着会有两个JVM实例,一个由MyService使用,另一个由其他代码使用?
  2.   
是的(以某种方式,但不完全是,它是一个dalvik VM,或者是Lollipop ART),但是,你有两个独立的东西来运行服务和其他代码。

  
      
  1. 如果上述问题的答案是肯定的,那么这是否也意味着如果我有一个单独的类使用活动&amp;我的服务,然后那里   将是为单身人士创建的两个实例吗?
  2.   

  
      
  1. 如何确保只创建一个实例&amp;然后由两个进程共享?更好地提供样本:)
  2.   
你不能!您刚刚告诉系统有单独的进程。所以它不能有“相同”的单身。

一种方法是让你的服务实现一个binder或AIDL(如果你要直接调用方法)或实现一个ContentProvider,它可以在你可以从中读取值的进程中相同。

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

修改

  

不幸的是,我的项目需要使用单独的服务流程   有长期运行的后台任务

如果您的项目需要长时间运行的后台任务,那么您肯定需要Service。但这并不意味着它需要处于一个单独的过程中。您项目中的所有活动都可以转到后台并进行垃圾回收,您的服务仍可正常运行。它将继续在活动运行的同一进程上运行,但服务和单例仍然存在。请记住return START_STICKY

如果你仍然认为你需要在一个单独的过程中使用它(我认为你不需要)。然后你需要实现一个绑定服务(或者可能是AIDL,我不确定绑定服务是否可以跨进程工作),将活动连接到它并使用常规方法(如public void takeThisObJect(Object reference);

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

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