“多進程”,你不知道的事(上)

Android中,每個應用程序都有自己獨立的資源和內存空間,進程間是不能

隨便互相訪問的,系統(tǒng)給每個進程分配的內存大小都是固定的。

內存溢出的原因其實就是因為應用程序使用內存超出了系統(tǒng)所分配的內存空

間,所以就導致了內存溢出。我們可以在android:minSdkVersion="11"以上的應用中給AndroidManifest中的Application標簽增加一個屬性:android:largeHeap="true",請求系統(tǒng)給當前應用分配更多內存。

當然,這么做的話對于API小于11版本的應用程序就不能使用了?;蛘弋斆總€程序都在后臺運行,如果都需要系統(tǒng)分配內存,程序一多,內存就不夠分配了,系統(tǒng)的運行就會卡頓,效率就會降低。

那么,我們如何去完全的解決這個問題呢?

這就要看多進程了。

如何開啟多進程?

簡單的兩步:

AndroidManifest.xml中設置android:process=":remote"

android:name=".remoteService"

android:label="@string/app_name"

android:process=":remote"/>

(這里process中“:”開頭表示的是私有進程,如果是其他的字符,就是公有進程)

然后在Acitvity中啟動這個服務

Intent intent = new Intent(this,remoteService.class);

startService(intent);

(還有種方法是用過JNI利用C/C++調用fork()方法來生成子進程)

當然,如果不再需要該進程,系統(tǒng)會在退出這個Activity的時候將其K掉;

了解了進程,我們再來看看進程的優(yōu)先級

進程分為五個等級:

前臺進程、可見進程、服務進程、后臺進程、空進程;

空進程:

看字面意思就知道,空進程相比較他們四個而言優(yōu)先級肯定是最弱的,弱爆了的那種,一看就知道系統(tǒng)最先K掉的就是它,為啥?因為它沒啥用啊,空的占位置嘛。但是,它也有被保留的時候,那就是當某個程需要被再次啟動時,會留作緩存作用,縮短下次啟動的時間。

后臺進程:

后臺嘛,由于用戶對它沒啥感覺,所以系統(tǒng)可能會隨時帶走它,但是畢竟有許多的后臺進程在運行,因此他們也會保存在LRU列表中,來確保包含用戶最近查看的Activity所在進程最后一個被終止(onStop());

服務進程:

服務進程與用戶所見的內容也是沒有直接關聯(lián)的,但是他們通常在執(zhí)行一些用戶關心的操作(下載、音樂播放),所以他的進程優(yōu)先級就比較高了;

可見進程

既然都已經(jīng)可以見了,所以優(yōu)先級是高于服務進程的(不在前臺運行時,但用戶還是可見,調用onPause()方法);

前臺進程

就相當于是用戶的操作界面了,系統(tǒng)是不會將它殺死的,當然,如果程序報錯出現(xiàn)異常另當別論;

上面我們說到了“:”的是私有進程,沒有“:”的是全局進程,那么它們的區(qū)別在哪里?

簡單來說,全局進程是通過shareUID來跟他處于同一個進程里,具有相同UID的應用可以共享數(shù)據(jù),可以互相訪問對方的私有數(shù)據(jù),就相當于一把鑰匙,對方都有了自己的鑰匙,就可以隨意來查看你在做什么(很邪惡是不是???),那么私有進程就是我不讓其它的組件跟我在同一個進程里面,無法訪問我的數(shù)據(jù);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容