今天來了解一下process,一下參考官網,那就開始吧!
每一個APP都有自己的process,但是process是否該結束,並不是由APP決定的,而是由系統決定。系統會自行判斷APP的權重、記憶體用量等,來決定該砍哪一個process。所以如果APP沒設計好,是有可能被系統錯殺掉的。
哪時候會被錯殺呢?官網舉了一個小範例:當BroadcastReceiver收到一個intent,並建立一個thread,接著return掉onReceive()。這時系統就會以為這個receiver工作結束了,當記憶體不足時隨時可能把它砍掉。當process被砍掉時,thread也就跟著被砍掉了。解法是使用JobService,詳細使用方法這裡先跳過。
那麼,process的權重是怎麼排名的呢?
該APP正在被使用。有可能是activity停留在Resumed state,或者是BroadcastReceiver.onReceive()正在執行,又或者Service的某些callback正在被執行。
APP可以被看見。有可能是activity停留在Paused stat,或是Service執行startForeground()等。
Service就是ㄧ些背景執行的程式。其實我覺得有些背景執行程式超重要的,居然才排名第三,很明顯的就是只注重外表的概念(系統OS:只要使用者沒發現,我就偷偷把背景程式給砍了吧)。而且執行太久(ex. 30分鐘以上)的service權重就會被降低,要注意。
系統存有一些cached process是好事,這樣要再叫起該process會較快速。Cache空間有限,系統需有一套規則來決定哪些process可以被留在cache,例如least recently used演算法等。
了解process之後,下一個疑問就會是,process間如何溝通呢?
Android的IPC設計,這篇教學講的非常詳細。
總之,Android最後生出了Binder來作為IPC機制。但大多數使用者不會直接使用Binder class,而是會使用已經打包好的Android Interface Definition Language (AIDL)。
關於Android IPC還有好多東西,我先把名詞記錄下來,之後好好研究。