參考
Android多進(jìn)程的數(shù)據(jù)庫(kù)訪問(wèn)問(wèn)題
Android中多進(jìn)程的應(yīng)用
Android IM 開發(fā)小結(jié)
關(guān)于 Android 進(jìn)程?;睿闼枰赖囊磺?/a>
在Android開發(fā)中,我們可能會(huì)使用單獨(dú)的進(jìn)程來(lái)做一些事情,比如推送服務(wù),心跳服務(wù)等,這些不需要主應(yīng)用啟動(dòng),只需要一個(gè)獨(dú)立的進(jìn)程即可。這時(shí)候我們一般都會(huì)采用啟動(dòng)一個(gè)后臺(tái)Service,這個(gè)Service運(yùn)行在一個(gè)獨(dú)立的進(jìn)程中,比如在Androidmainfest.xml中配置Service的android:process=”:push”指定該Service運(yùn)行在:push進(jìn)程中。
一般情況下這樣做是沒(méi)有任何問(wèn)題的,但是如果你在你的Application的onCreate方法里有對(duì)數(shù)據(jù)庫(kù)的操作,或者該Service里有對(duì)數(shù)據(jù)庫(kù)的操作,就會(huì)有可能會(huì)有兩個(gè)進(jìn)程同時(shí)操作一個(gè)數(shù)據(jù)庫(kù)的情況,一個(gè)是你的主應(yīng)用的進(jìn)程,進(jìn)程名為你的包名例如org.flysnow;一個(gè)是你的Service所在的進(jìn)程,進(jìn)程名為你的包名+”:push”,即org.flysnow:push。這兩個(gè)進(jìn)程可能在同一時(shí)間訪問(wèn)同一個(gè)數(shù)據(jù),同一個(gè)配置文件等。這就可能造成資源的競(jìng)爭(zhēng)訪問(wèn),造成的問(wèn)題就不可預(yù)料了,比如數(shù)據(jù)庫(kù)損壞,數(shù)據(jù)丟失等。
多進(jìn)程其實(shí)和多線程一樣,并發(fā)訪問(wèn)的時(shí)候產(chǎn)生的問(wèn)題很難預(yù)料,在多線程的時(shí)候我們有鎖等機(jī)制控制資源的訪問(wèn),但是在多進(jìn)程中比較難,雖然有文件鎖、排隊(duì)等機(jī)制,但是在Android里很難實(shí)現(xiàn),畢竟在Android里一個(gè)進(jìn)程就是一個(gè)VM虛擬機(jī),底層的東西控制不了,Java層又沒(méi)有辦法控制,所以在多進(jìn)程中一定不要有并發(fā)增刪改文件的操作。
解決問(wèn)題的核心就是不并發(fā)訪問(wèn)同一個(gè)文件,多線程時(shí)就使用Lock機(jī)制;多進(jìn)程的時(shí)候就避免進(jìn)行數(shù)據(jù)庫(kù)的訪問(wèn),比如只做一些心跳、激活、消息抓取等操作,涉及到把消息存儲(chǔ)到數(shù)據(jù)庫(kù),訪問(wèn)配置文件等操作還是調(diào)用主進(jìn)程進(jìn)程操作。還一個(gè)要注意的就是Application的oncreate方法里要避免多進(jìn)程訪問(wèn)同一文件,因?yàn)闆](méi)一個(gè)進(jìn)程初始化都會(huì)執(zhí)行該方法,可以在一些進(jìn)程初始化的時(shí)候不需要文件操作的時(shí)候不要進(jìn)行文件操作,比如在onCreate里獲取當(dāng)前的進(jìn)程,不等于包名的就不進(jìn)行文件的訪問(wèn)操作,獲取進(jìn)程可以使用android.os.Process.myUid()方法。
好處:
1、分擔(dān)主進(jìn)程的內(nèi)存壓力。我們的應(yīng)用越做越大,內(nèi)存越來(lái)越多,將一些獨(dú)立的組件放到不同的進(jìn)程,它就不占用主進(jìn)程的內(nèi)存空間了。比如在啟動(dòng)一個(gè)不可見的輕量級(jí)私有進(jìn)程,在后臺(tái)收發(fā)消息,或者做一些耗時(shí)的事情,或者開機(jī)啟動(dòng)這個(gè)進(jìn)程等。
2、防止主進(jìn)程被殺守護(hù)進(jìn)程,守護(hù)進(jìn)程和主進(jìn)程之間相互監(jiān)視,有一方被殺就重新啟動(dòng)它。
壞處:
1、多占了系統(tǒng)的內(nèi)存空間,很容易沾滿而導(dǎo)致卡頓,同時(shí)也消耗用戶的電量。同時(shí)在啟動(dòng)單獨(dú)進(jìn)程時(shí),進(jìn)程的創(chuàng)建會(huì)影響繼承Application的實(shí)例,onCreate()會(huì)再次執(zhí)行一遍。
2、不同進(jìn)程之間內(nèi)存不能共享,最大的弊端是他們之間通信麻煩,不能將公用數(shù)據(jù)放在Application中,堆棧信息、文件操作也是獨(dú)立的,如果他們之間傳遞的數(shù)據(jù)不大并且是可序列化的,可以考慮通過(guò)Bundle傳遞, 如果數(shù)據(jù)量較大,則需要通過(guò)AIDL或者文件操作來(lái)實(shí)現(xiàn)。