方法:
在AndroidManifest.xml中,给四大组件中指定android:process属性
例子:包名com.xxx
1.android:process=“:remote”
2.android:process=“com.xxx.remote”
安卓默认进程名:com.xxx
1.进程名:com.xxx:remote,当前应用的私有进程,其它应用的组件不能和它跑在一个进程
2.进程名:com.xxx.remote,全局进程,其它应用可以通过ShareUID方式和它跑在一个进程
adb shell ps | grep com.xxx 查看应用下的进程
不同的进程访问同一个类的对象,会产生多个副本
多进程带来的问题
1.静态成员和单利模式完全失效(进程与进程之间不共享内存的数据)
2.线程同步机制完全失效(锁的不是同一个对象)
3.SharedPreferences可靠性下降
4.Application多次创建
进程通信方式
1.intent
2.共享文件
3.SharedPreferences(可靠性下降,具体见下面sp多进程例子)
4.SQLite ,解决3可靠性下降的问题
sp多进程例子
有A,B两个Activity,对sp的同一个key进行操作
首先,A向sp写入值,并读取,没问题
接下来,从A跳进B,读取sp,结果正确
然后,在B中向sp写入值,并读取,没问题
最后,返回A,在读取sp的值,发现值并没有改变(还是第一次在A中读取的值,而不是B修改后的值)
原理分析
SP使用了缓存的机制,会先把数据保存在内存中,在读取的时候直接从内存中读取,而写的时候才会保存到文件
多进程之间内存不可见
注:即使使用MODE_MULTI_PROCESS也不能保证进程间的同步
sp存储的内容是没有长度限制的,因为它实际上是一个xml文件,而xml文件的value是不会限制长度的
跨进程通信的测试用例(代码在ThirdJar的com.sf.service下)
Service向Activity传递数据的方法
1.广播
2.通过bindservice,同时在Service中创建一个Binder对象和一个接口,在onServiceConnected回调中通过binder得到Service对象,然后对这个接口进行监听,就能得到Service传递过来的数据
一个Activity,一个Service
同一个进程中
1,2均可行
对service加android:process属性,两个进程
1 可行
2 报错 java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.sf.service.PlayService$MyBinder
PlayService ps = ((PlayService.MyBinder) binder).getService(); 报错代码
如果一个应用有多个进程,则我们在彻底退出程序时,只会销毁退出界面所在的进程,利用此特点,可以将Service放在其它的进程中,这样在程序退出后,Service仍可以正常运行。当然如果直接杀死程序,多个进程会同时被销毁