天天看点

Android中android_process多进程的坑

  在Android的帮助文档中我们可以了解到,一般情况下一个服务没有自己独立的进程,它一般是作为一个线程运行于它所在的应用的进程中。但是也有例外,Android声明文件中的android:process属性却可以为任意组件包括应用指定进程,换句话说,通过在声明文件中设置android:process属性,我们可以让组件(例如Activity, Service等)和应用(Application)创建并运行于我们指定的进程中。

好处: 1.给进程分配了独立的内存,避免了OOM。 2.分担主进程的内存压力。 坏处: 1.多进程开启时,Appliaction的onCreate方法被执行多次,导致重复初始化资源,增加了初始化时间,Android为每个进程分配了独立的虚拟机,所以我们不能直接将一些数据保存在Application中。 2.进程间的内存相互间是不可见的,不能用常规方法来共享数据库。 3.静态成员和单例模式完全失效(不是同一块内存,会产生不同的副本) 4.线程同步机制完全失效(不是同一块内存,所以对象也不是同一个,因此类锁、对象锁也不是同一个,不能保证线程同步) 5.SharedPreferences 可靠性下降(SharedPreferences不支持多个进程同时写,会有一定的几率丢失数据) 6.如果在新进程中要进行Umeng统计或分享等类似的第三方操作,需要重新初始化,并且分享很容易出现问题。 总结: 1.对于一些大图显示,详情页可以使用多进程来避免OOM,但是要尽量避免数据库操作和引用单例。 2.如果要操作SharedPreferences,可使用如下方式来创建,不过SharedPreferences不是线程安全的,所以使用要慎重。

SharedPreferences s = getApplicationContext().getSharedPreferences("UserData",Context.MODE_MULTI_PROCESS);      

3.多线程间的数据共享,可以通过AIDL,Messenger或者ContentProvider来实现。可以参考 http://www.open-open.com/lib/view/open1473735422932.html http://www.cnblogs.com/android-blogs/p/5816922.html 4.在新进程中,尽量减少单例、 SharedPreferences以及第三方分享等操作。