方法:
在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.靜態(tài)成員和單利模式完全失效(進程與進程之間不共享內存的數據)
2.線程同步機制完全失效(鎖的不是同一個對象)
3.SharedPreferences可靠性下降
4.Application多次創(chuàng)建
進程通信方式
1.intent
2.共享文件
3.SharedPreferences(可靠性下降,具體見下面sp多進程例子)
4.SQLite ,解決3可靠性下降的問題
sp多進程例子
有A,B兩個Activity亭珍,對sp的同一個key進行操作
首先,A向sp寫入值枝哄,并讀取肄梨,沒問題
接下來,從A跳進B挠锥,讀取sp众羡,結果正確
然后,在B中向sp寫入值蓖租,并讀取粱侣,沒問題
最后,返回A蓖宦,在讀取sp的值齐婴,發(fā)現值并沒有改變(還是第一次在A中讀取的值,而不是B修改后的值)
原理分析
SP使用了緩存的機制稠茂,會先把數據保存在內存中柠偶,在讀取的時候直接從內存中讀取,而寫的時候才會保存到文件
多進程之間內存不可見
注:即使使用MODE_MULTI_PROCESS也不能保證進程間的同步
sp存儲的內容是沒有長度限制的主慰,因為它實際上是一個xml文件嚣州,而xml文件的value是不會限制長度的
跨進程通信的測試用例(代碼在ThirdJar的com.sf.service下)
Service向Activity傳遞數據的方法
1.廣播
2.通過bindservice,同時在Service中創(chuàng)建一個Binder對象和一個接口共螺,在onServiceConnected回調中通過binder得到Service對象该肴,然后對這個接口進行監(jiān)聽,就能得到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仍可以正常運行。當然如果直接殺死程序立哑,多個進程會同時被銷毀