為什麼安卓不採用墓碑機制?
很多答主並不是開發者,不了解系統實現的細節。所以我相對專業地回答一下。
首先要弄清楚什麼是『墓碑機制』。簡單來說墓碑機制就是當 app 進入後台前將應用狀態以某種形式持久化,然後釋放其正在使用的資源(包括內存、CPU 等),等待 app 再次進入前台時再將這個保存的狀態恢復出來,此時應用就跟沒有被殺死繼續運行了一樣。
實際上 iOS 不是嚴格意義上的墓碑機制,因為 iOS 應用在進入後台時可以向系統申請一定時間的後台運行時間(一般不超過 10 分鐘),在這個時間超過後進程會被掛起,CPU 資源完全釋放,內存會被保留,這時再次進入應用,系統直接將掛起的進程繼續就可以了,不需要做任何顯式的狀態保存和恢復。然而如果應用很長時間沒有被調到前台了,或者內存資源十分緊張,系統缺頁且虛擬內存也十分緊張,那麼 UIApplication 會代理系統告訴應用『你要被殺死了』,部分應用就會做最後的狀態保存工作(application:shouldSaveApplicationState: 需要返回 YES 並且開發者需要做適配工作),之後系統會完全關閉應用的進程並且釋放所有內存,再次進入應用時如果開發者沒做(國內大部分 app 都沒做)上面的狀態保存工作的話,這個應用就跟全新打開一樣,之前編輯的文本、瀏覽的文章全部丟失,應用重新從 main 函數執行。
再說 Android,Android 沒有像 iOS 那用嚴格限制應用的後台時間,相反還允許開發者使用 Service、Broadcast Receiver 等組件長時間駐留在後台。正是由於沒有 iOS 這種限制,開發者開始肆無忌憚地開 Service,瘋狂防止被殺死,很遺憾,內存滿了。這時系統就會發出警告(onTrimMemory),如果應用仍然不管不顧地不釋放資源(包括 Java VM Heap 和 Ashmem 等區域),系統只好把這個應用殺掉了,但是 Android 會通過自己的狀態保存與恢復機制存儲部分應用數據,大部分的 Widgets 都實現了狀態保存與恢復,那麼下次應用重啟時這些 UI 的狀態還在,但是其他的數據就會丟失掉。由於 Android 對很多組件都做了簡單的狀態管理,所以像 Intent、Bundle 這樣的對象都可以很容易地被系統序列化保存到磁碟。用戶也就很少會看到像 iOS 應用那樣從頭運行的情況,一般都是以 Activity 為單位地恢復,但是緩存在內存的圖片、數據會丟失,需要重新載入。
所以不是不能採用墓碑機制,是現在的系統會分情況使用不同的內存管理機制。如果 Android 一開始就用墓碑機制,Service、AIDL、Binder 啥的我們都可以不學了。要知道墓碑機制鼻祖 Windows Phone 就是個單任務系統。
Android哪裡沒有用到墓碑機制了?
onCreate()onSaveInstanceState()onRestoreInstanceState()的bundle參數跑個題。安卓可是安卓,自己搞墓碑不是美滋滋?綠色守護,組止運行,黑域。
因為不能。
先百度一下iOS的後台管理。iOS 為了讓設備盡量省電,減少不必要的開銷,保持系統流暢,因而對後台機制採用墓碑式的「假後台」。除了系統官方極少數程序可以真後台,一般開發者開發出來的應用程序後台受到以下限制:1.用戶按Home之後,App轉入後台進行運行,此時擁有180s後台時間(iOS7)或者600s(iOS6)運行時間可以處理後台操作2.當180S或者600S時間過去之後,可以告知系統未完成任務,需要申請繼續完成,系統批准申請之後,可以繼續運行,但總時間不會超過10分鐘。3.當10分鐘時間到之後,無論怎麼向系統申請繼續後台,系統會強制掛起App,掛起所有後台操作、線程,直到用戶再次點擊App之後才會繼續運行。當然iOS為了特殊應用也保留了一些可以實現「真後台」的方法,摘取比較常用的:1.VOIP2.定位服務3.後台下載4.在後台一直播放無聲音樂(容易受到電話或者其他程序影響,所以暫未考慮)
android目前是什麼情況大家也清楚,沒有強制統一的系統級消息推送,app審核不嚴,碎片化嚴重。如果所有後台統一殺死,那很多功能都實現不了。例如消息推送,例如下載,例如播放音樂。結果變成單任務如果給後台留下像iOS那樣的申請保留的許可權。我保證這個許可權會被濫用。結果完全失效。如果統一消息推送,統一下載介面,音頻播放介面,各種介面。像iOS那樣把自己圍起來,那這時候android還是開放的android么?最後還是得在封閉系統才能發揮。謝腰
不是開發者,就是個愛好者,所以簡單聊聊自己知道的吧,也許不夠準確,看看就好,也歡迎指點。
首先為什麼Android當初就沒採用墓碑機制呢?其實從資源利用的角度講,個人覺得Android的後台機制是優於ios的。
Android的內存使用大概是這麼個流程,打開app-內存被佔用-關閉app-內存部分保留方便下次讀取-如果被佔用內存太多新打開app內存不足-記錄下當前內存里的信息並釋放內存。
而ios是打開app-佔用內存-關閉app-記錄內存里的信息,如果不著急用內存就放一會兒(幾十秒到幾分鐘不等)著急用就釋放內存。
從這裡可以看出,Android其實一直是有所謂的墓碑機制的,就是跟ios起的名字不一樣。然而Android在墓碑機制的基礎上,增加了一個內存緩衝機制,可以讓你更快的訪問內存里的數據,而不用通過墓碑機制重新渲染,等到內存不夠用的時候,才會啟動墓碑機制。這相比較於ios的說沒就沒的墓碑機制其實是更好的。
ios的墓碑機制也有自己的弊端,一是讓多任務操作變得難以實現,記不清是ios幾了,在那之前你想這邊緩存個劇,那邊還玩個遊戲,再放個歌,這是做不到的……緩存的那個應用在你切出去干別的時候,他的內存就被釋放掉了……這就很尷尬了……而且這種墓碑機制看起來很節約,但是也在某種程度上限制了ios設備的性能上限,很簡單的例子,Safari瀏覽網頁,看多了你再切回前面的網頁會發現要重新載入……就是因為內存里放不下了,只能把那個網頁的內存釋放了回頭重新載入了,所以總是夠用就好也不好其實……
不過就墓碑機制重新啟動app的渲染速度來說,ios還真是快,具體因素不知道,有知道的還望賜教。
再說Android,Android在國外有GMS服務,你應用可以直接關掉,推送的事兒交給GMS(還是GCM我實在搞不清,將就看吧)給你辦就行,這樣程序又能結束,又不會影響通知的推送,後台常駐一個系統級的GCM(GMS和GCM我還是有點暈……)就行了。所以很多國外應用是你關了就關了的,並不那麼吃配置。
但是國內因為不可描述的原因,GMS沒法用,所以app廠家們就群魔亂舞了……這兩個用這家的推送服務,那兩個用那家的,這幾個自己搞自己的推送服務,最後結果就是,一個軟體有一堆後台,你如果用墓碑機制給他們真都弄死了,那你通知也收不到了……
再者國內app開發對系統的資源使用簡直是……以前聽的開玩笑的話是,google store的軟體是,要用多少ram跟系統要多少,國內的軟體是,系統有多少他要多少……而且因為利益相關,軟體之間拼了命的相互啟動,你開一個微博,過一會兒不知道後台給你喚醒了多少應用,這個PY來的東西啊……你能說什麼呢……罵他們不要臉也沒用啊……
倒是硬體不可能無限制的增長是沒錯,不過其實消費者不需要太擔心這個問題,一來Android官方不可能看著這個事情不管,真等那天打開一個微博掛一個微信要8G內存了,那……Android自己也會有相應措施。哪怕Android沒有,手機廠家也要急了,你說本來什麼如絲般順滑的體驗,讓你們這些流氓軟體商都玩兒壞了,這讓我們怎麼賣手機?!這產生的利益糾葛也足夠讓他們喝一壺的了。其實現在國產的手機廠商都已經開始越來越注意手機資源的分配問題了,都在推出各種智能管理後台的功能,而且都往智能化的方向發展了,就例如我手上的魅族,刷了flyme6以後經常出現一個情況,起床以後點亮手機,就冒出不少推送來,我一直以為是個bug,後來發現這個點兒就是按照我起床的點兒來的,是電量管理的一個功能選項,根據作息時間屏蔽推送的通知……雖然做的還挺生澀,但是我覺得這個還是在往智能的方向上靠的。
所以總的來說,Android有一種比純粹的墓碑機制更好的內存管理方案,但是被國內的app開發玩兒壞了,愁壞了手機廠商,這兩年在拚命找補這方面。所以說不用操系統的心,商家比你著急多了……而且這幾年雖然一直硬體競賽,但是價錢呢?一直都還是那個價啊,而且這也無形中提升著用戶體驗,哪怕是ios,那也是大ram比小ram的好用!沒有硬體的提升,你寫代碼的本事就是突破天際,也白搭不是?
以上。
從Android組件回調介面的設計來看,大部分都是考慮到切換後台,資源回收,低內存等極端狀態的。只是很多開發者並不care這些,而是想盡一切辦法在保活……和IOS比起來安卓的後台策略確實溫柔很多,但新版本也回收了不少許可權,比如網路狀態變化。
其實說到底,app卡,大多數根源還是代碼質量差。只不過在Android上,有可能是其他app的代碼差……神他媽比不過蘋果眾所周知,你是怎麼比的?Android機那麼多你拿哪部比的?流暢性是靠什麼提現的?結果報告呢?
這麼和你說吧,你找一個和iPhone同價位的Android手機,流暢度比不過蘋果我直播吃屎。
還有問題描述裡頭,別搞得好像你多了解Android和iOS系統一樣,看見這類小白一樣的問題真的煩。
有人的地方就有政治
有 App 的地方就有對 CPU 的爭奪
完全是 Google 的 PM 異想天開覺得 App 會安分守己,而讓千萬 android 用戶為此遭罪。Android O新特性就是限制後台應用,早晚會加上的,只是換種方式而已
iOS是個單純的手機系統,Android的目標是統一嵌入式市場,不是用來只是手機用的,顯然不能加入這種機制,定位不同無法比較的
沒必要。
加點內存又貴不了多少。
安卓之前比不上蘋果的流暢,1.是因為系統任務機制的不同,安卓是真多任務,蘋果是假的
2.以前是dalvik效率低,佔用資源大,5.0以後換成了art
3.安卓應用不像蘋果應用必須遵循一套標準大抵是這樣的原因吧。回到正題,為什麼不採用與蘋果類似的墓碑機制,1.iOS的並不是墓碑機制,相反Android的才是2.既然提到和iOS類似,還是有必要繼續說幾點,系統方面,Android比iOS更便宜能用大量資金提升硬體,沒有必要犧牲系統的功能。記住一句話,一切卡頓都只能說明你手機辣雞,該換了 3.像安卓這樣真正多任務的才能讓用戶覺得更方便(至少我是這樣認為的,因為蘋果只要進入另一個程序,前面的程序就關閉了,比如遊戲和QQ來回切換的時候就讓人很煩,聊完QQ回來遊戲又重啟了)推薦閱讀:
※Windows Phone 7 系統的使用體驗,相對 Android 和 iOS 來說,有哪些優劣之處?
※為什麼安卓不採用推送(push notification)這種優雅,省資源的通知方式呢?
※iOS 8.1.2 到 iOS 8.1.3 有什麼變化?升級好不好?
※安卓的通知系統和iOS的比較?
※iPhone6s升級iOS11會不會卡?耗電怎麼樣?