Android中,每個應用程序都有自己獨立的資源和內存空間,進程間是不能
隨便互相訪問的,系統給每個進程分配的內存大小都是固定的。
內存溢出的原因其實就是因為應用程序使用內存超出了系統所分配的內存空
間,所以就導致了內存溢出。我們可以在android:minSdkVersion="11"以上的應用中給AndroidManifest中的Application標籤增加一個屬性:android:largeHeap="true",請求系統給當前應用分配更多內存。
當然,這麼做的話對於API小於11版本的應用程序就不能使用了。或者當每個程序都在後台運行,如果都需要系統分配內存,程序一多,內存就不夠分配了,系統的運行就會卡頓,效率就會降低。
那麼,我們如何去完全的解決這個問題呢?
這就要看多進程了。
如何開啟多進程?
簡單的兩步:
AndroidManifest.xml中設置android:process=":remote"
<service
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方法來生成子進程)
當然,如果不再需要該進程,系統會在退出這個Activity的時候將其K掉;
了解了進程,我們再來看看進程的優先順序
進程分為五個等級:
前台進程、可見進程、服務進程、後台進程、空進程;
空進程:
看字面意思就知道,空進程相比較他們四個而言優先順序肯定是最弱的,弱爆了的那種,一看就知道系統最先K掉的就是它,為啥?因為它沒啥用啊,空的佔位置嘛。但是,它也有被保留的時候,那就是當某個程需要被再次啟動時,會留作緩存作用,縮短下次啟動的時間。
後台進程:
後台嘛,由於用戶對它沒啥感覺,所以系統可能會隨時帶走它,但是畢竟有許多的後台進程在運行,因此他們也會保存在LRU列表中,來確保包含用戶最近查看的Activity所在進程最後一個被終止(onStop);
服務進程:
服務進程與用戶所見的內容也是沒有直接關聯的,但是他們通常在執行一些用戶關心的操作(下載、音樂播放),所以他的進程優先順序就比較高了;
可見進程
既然都已經可以見了,所以優先順序是高於服務進程的(不在前台運行時,但用戶還是可見,調用onPause方法);
前台進程
就相當於是用戶的操作界面了,系統是不會將它殺死的,當然,如果程序報錯出現異常另當別論;
上面我們說到了「:」的是私有進程,沒有「:」的是全局進程,那麼它們的區別在哪裡?
簡單來說,全局進程是通過shareUID來跟他處於同一個進程里,具有相同UID的應用可以共享數據,可以互相訪問對方的私有數據,就相當於一把鑰匙,對方都有了自己的鑰匙,就可以隨意來查看你在做什麼(很邪惡是不是???),那麼私有進程就是我不讓其它的組件跟我在同一個進程裡面,無法訪問我的數據;