安卓系統的後台是怎樣的?

關於安卓的後台,實在是有很多大神有各種意見,但是似乎說的不太一樣,有的說安卓其實一後台就凍結了,那不是和蘋果一樣,可是為什麼開多了任務會卡?有人說都在後台,當內存不夠時就釋放最不常用的,有人說要後台就要開服務,那服務總是後台?退出後為什麼還是占內存?還有ram和rom,ram有什麼特殊的地方?為什麼一定要緩存及運行在ram里?


activity一丟到後台就停下來(相應的activity里會有一個onStop()回調)。

如果一個進程丟到後台時(process)只包含activity,就是所謂:

安卓其實一後台就凍結了

以這樣的形式,二十多這樣的不消耗CPU的process佔據了大約不到500兆的空間,但這裡把它們佔據的空間標記為free,表示它們的優先順序很低,如果系統需要更多內存,第一個想到的就是找它們開刀。然而沒有它們,每次切換到另一個應用程序時,都要花費相當於重新載入的時間。

如果真的要殺Activity,Android還留了一個onDestroy()回調,Activity可以在裡面寫好墓志銘,等到重生時能原地滿血復活------所謂墓碑機制

舉例:

在我的手機上,沒有緩存進程時,啟動淘寶需要大約7秒鐘,有緩存進程時,只用1秒便能恢復運行

在官方模擬器(armv7)里,沒有緩存進程,啟動qq瀏覽器直到顯示出快速導航大約花費10秒,有緩存進程時,花費不到兩秒

service就是用來在後台運行的(它還可以用來做一些「前台」的工作來避免阻塞主線程)。

如果一個應用程序的進程跑到後台時,沒有關掉(涉及onDestroy()回掉)它包含的Service----故意開啟,或者因故自己關不掉。那麼service就會運行直到關閉為止。

可以看到只有目前的Activity所屬的應用程序:Settings是可以不包含service而運行的。

其它的幾個都是service,這些內容佔掉250兆左右內存。

再左邊的"used"的內存包括了那些不屬於「Android應用程序」的軟體的進程,Android Framework等,還可以看到2G內存有一部分未顯示在圖中(圖中只有1.8G左右的內存),用來存放Linux Kernel,基帶鏡像,充當顯存等作用。

這一段是猜測:

service運行時間長了或者把cached process殺了還嫌內存不夠,系統就會對一般的service開刀。標記為Important,或者是前台service的優先順序更高,不容易被殺死。就Android應用程序而言前台Activity的優先順序最高,只要不出導致崩潰的Exception或者嚴重的內存不足,它就不會死。

至於Android怎麼處理Activity、Service,Process、Thread之間的關係;有運行著的Service而沒有獲取wekelock時讓設備休眠時,Service/Process處於的狀態算什麼(我們知道剛關屏幕的時候,沒有鎖wakelock的Service還是能動的,過大約十二十分鐘,Service才會什麼也做不了),請查閱相關資料,我不知道。

這裡有從開發者角度的說明:

Android 組件Service 詳解總結,Thread

關於內存的事項:

如果硬碟速度足夠快,內存這東西是不是就可以取消了?

-

如果是為了防止阻塞UI線程而作非同步運行,Android還可以利用Java的Thread,以及Android的AsyncTask。別的系統肯定有達到同樣目的的實現。

可以看到

iOS有非常類似Activity的機制,而Android的Service在iOS中則沒有如此一致的實現。

iOS 7 的新後台多任務(multitasking)機制是如何工作的?


總結一下後台的原理和到底什麼是消耗我們的內存。

--------------------------------------------------------------------------------------------------------------------------------------------

1、Android的每個應用都獨立運行在單獨的任務棧裡面,這樣避免了某個應用的崩潰導致整個系統崩潰,這樣做的代價就是內存需要更多;

2、Android的應用被切換到後台以後,其實它已經被暫停了,這時候只保留應用運行狀態(包括應用的靜態變數,IO流等,所以開發應用的時候應該即時進行釋放)這樣的好處是可以很快速的恢復應用,但是這些也會有少量的內存消耗;

3、後台Service,通常後台服務都是處理一些耗時、數據量大的操作,這個肯定是又耗內存又耗電的。

通常我們使用Android手機的時候常用軟體是不需要刻意去手動清理的,那我們啟動一個大型遊戲的時候內存不足怎麼辦?Android在系統內存不足的時候會自動觸發系統的進程調度策略,用來選擇性的反覆篩選和關閉一些優先順序低和內存佔用大的應用,但是這個策略執行是很消耗系統資源的,所以這時候我們會感覺到明顯的卡頓。

RAM就是內存,比如常見的512M、1G、2G;

ROM就是機身存儲空間,比如iPhone的16G、32G、64G。


不太懂,可能和安卓的虛擬機以及它的預編譯有關吧,每次運行都要預先編譯轉換語言,這也是安卓系統卡慢,吃配置的原因之一吧,好在5.0以後的art模式,不用預編譯了,真的流暢度提升了好多


我只知道,google搜索,onenote,這些60多m的程序,啟動後不用就後台自動緩存了,下次秒開,而且不用時也不耗電。

這才是安卓真正的不需要退出鍵的典型。

反觀其他的毒瘤APP,打開後,多的能出現數個進程和數個服務,連續返回鍵,退出和一鍵清理都阻止不了他們「正在重新啟動」

每次打開這些APP,啟動耗時,關閉時還得強制關閉,更煩心的還有不停的許可權請求,沒有就拒絕運行。

………………

看來用國產毒瘤APP,同等配置永遠是別想和iOS比流暢度了,現在手機里能用網頁的全部網頁。

………………

知乎沒有退出鍵,後台也有進程,即使這樣,還是不「流暢」


推薦閱讀:

拿到一個apk包後,怎麼判斷其是否加殼了?是否做了代碼混淆?
如何通過自學成為一名 Android 應用開發工程師?
Android 和 iOS 應用開發有哪些不同?
想開發一款安卓社交類的APP需要有哪些準備?
如何實現 Medium for iOS 那般的下劃線效果?

TAG:iOS開發 | Android應用 | Android開發 | 手機ROM |