Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

processes & singleton in Android

Three questions concerning processes in Android. I am developing one app. If I declare a service to be running in another process in AndroidManifest.xml

<service android:name=".MyService" android:process=":MyProcess"/>
  1. Does it mean there will be two JVM instances , one used by MyService while the other one used by other code?

  2. 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?

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

====UPDATE====

Thanks for all your comments and answer(s), unfortunately, my project needs to use separate service process as it has long running background tasks. According to your replies, I have a 4th question:

If I need to pass a non-parcelable object across MyService process and the other code's process. Is it possible? And how?

like image 904
Leem.fin Avatar asked Feb 24 '15 10:02

Leem.fin


1 Answers

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

yes (in a certain way, but not exactly, it's a dalvik VM, or in Lollipop ART), but yeah, you have two separate things running the service and rest of code.

  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?

yes

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

you can't! You just told the system to have separate processes. So it cannot have "the same" singleton.

An approach to that is have your service implement a binder or AIDL (in case you to direct calls methods) or implement a ContentProvider, which is the same across processes that you can read values out of it.

Or you can just make it all simpler and NOT use the process. 99.9% of use cases android:process is not advised. So re-evaluate your software. Do you really need it?

edit:

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

If your project need a long running background task, you need a Service for sure. But it doesn't mean it needs to be in a separate process. All the activities from your project can go to background and be garbage collected and your service still runs fine. It will keep running on the same process as the Activities were running but the Service and singletons will still be alive. Just remember to return START_STICKY from it.

If you still think you need to use it in a separate process (I don't think you need). Then you need to implement a bound service (or maybe AIDL, I'm not sure bound service will work across process), connect the activity to it and give the reference of the object using a normal method like public void takeThisObJect(Object reference);

links to bound and AIDL service guides:

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

like image 56
Budius Avatar answered Nov 02 '22 00:11

Budius