一、運(yùn)行機(jī)制的區(qū)別
1、iOS 采用的是沙盒運(yùn)行機(jī)制
(1)沙盒機(jī)制
? ? ????出于安全考慮,iPhone對(duì)于安裝在上面的應(yīng)用程序有所限制,這個(gè)限制就是應(yīng)用程序只能在該程序創(chuàng)建的文件系統(tǒng)中讀取文件,不可以去其他地方訪問,此區(qū)域被稱為沙盒,所以所有的非代碼文件都要保存在此,例如圖像、圖標(biāo)、聲音,映像,屬性列表,文本文件等??傮w來說沙盒就是一種獨(dú)立、安全、封閉的空間。
(2)沙盒機(jī)制的特點(diǎn)
? ? ? ? 每個(gè)應(yīng)用程序都有自己的存儲(chǔ)空間。每個(gè)應(yīng)用程序都不可以翻過自己的圍墻去訪問別的存儲(chǔ)空間的內(nèi)容(已經(jīng)越獄的除外)。在訪問別人沙盒內(nèi)的數(shù)據(jù)時(shí)需要訪問權(quán)限。沙盒(sandbox)的核心內(nèi)容是:sandbox 對(duì)應(yīng)用程序執(zhí)行各種操作的權(quán)限限制。
2、Android 采用的是虛擬機(jī)運(yùn)行機(jī)制
(1)什么是Dalvik虛擬機(jī)
? ? ? ? Dalvik 是 Google 公司自己設(shè)計(jì)用于 Android 平臺(tái)的 Java 虛擬機(jī),它是 Android 平臺(tái)的重要組成部分,支持 dex 格式(Dalvik Executable )的 Java 應(yīng)用程序的運(yùn)行。 dex 格式是專門為 Dalvik 設(shè)計(jì)的一種壓縮格式,適合內(nèi)存和處理器速度有限制系統(tǒng)。 Google 對(duì)其進(jìn)行了特寫的優(yōu)化,使得 Dalvik 具有高效、簡(jiǎn)潔、節(jié)省資源的特點(diǎn)。從 Android 系統(tǒng)架構(gòu)圖知, Dalvik 虛擬機(jī)運(yùn)行在Android的運(yùn)行時(shí)庫(kù)層。
(2)Dalvik 虛擬機(jī)的功能
? ? ? ? Dalvik 作為面向 Linux、為嵌入式操作系統(tǒng)設(shè)計(jì)的虛擬機(jī),主要負(fù)責(zé)完成對(duì)象生命周期管理、堆棧管理、線程管理、安全和異常管理,以及垃圾回收等。 Dalvik 充分利用 Linux 進(jìn)程管理的特性,對(duì)其進(jìn)行了面向?qū)ο蟮脑O(shè)計(jì),使得可以同時(shí)運(yùn)行多個(gè)進(jìn)程,而傳統(tǒng)的 Java 程序通常只能運(yùn)行一個(gè)進(jìn)程,這也是為什么 Android 不采用 JVM 的原因。 Dalvik 為了達(dá)到優(yōu)化的目的,底層的操作大多和系統(tǒng)內(nèi)核相關(guān),或者直接調(diào)用內(nèi)核接口。另外, Dalvik 早期并沒有 JIT 編譯器,直接 Android 2.2 才加入了對(duì) JIT 的技術(shù)支持。
(3)Dalvik 虛擬機(jī)具有以下特點(diǎn):
? ? ? ? 使用 dex格式的字節(jié)碼,不兼容 Java 字節(jié)碼格式
? ? ? ? 代碼密度小,運(yùn)行效率高,節(jié)省資源
? ? ? ? 常量池只使用32位的索引
? ? ? ? 有內(nèi)存限制
二、兩者后臺(tái)制度不同
1、iOS 采用“偽后臺(tái)”的形式
(1)iOS 系統(tǒng)的后臺(tái)機(jī)制過程
? ? ? ? 當(dāng)我們程序從前臺(tái)退到后臺(tái)(按 home 鍵)后,將執(zhí)行程序的委托方法,它的主線程會(huì)被暫停。應(yīng)用程序只給了我們可憐的一點(diǎn)點(diǎn)時(shí)間(也就是秒級(jí)別的)來處理東西,然后,所有的線程都被掛起了。這個(gè)時(shí)候 APP 依然駐留在內(nèi)存中,這種狀態(tài)下,不調(diào)用蘋果已開放的幾種后臺(tái)方法,程序便不會(huì)運(yùn)行;如果在這個(gè)時(shí)候,使程序繼續(xù)運(yùn)行,則為后臺(tái)狀態(tài);如果當(dāng)前內(nèi)存將要不夠用時(shí),系統(tǒng)會(huì)自動(dòng)把之前掛起狀態(tài)下的 APP 清出內(nèi)存。所以我們看到,有些時(shí)候打開 APP 時(shí),還是上次退出時(shí)的那個(gè)頁(yè)面那些數(shù)據(jù),有時(shí)則是重新從閃屏進(jìn)入。
(2)iOS 系統(tǒng)后臺(tái)機(jī)制大概可以分為5種狀態(tài):
? ? ? ? Not Running : APP 沒有啟動(dòng),也沒有后臺(tái)運(yùn)行;
? ? ? ? Active :用戶正在使用 APP,比如說我們聊微信看網(wǎng)頁(yè)的時(shí)候,APP 就處于 Active 狀態(tài);
? ? ? ? Inactive :這是一個(gè)過渡的狀態(tài),APP 雖然打開了,但是用戶沒有跟 APP 有任何互動(dòng)操作;
? ? ? ? Background:APP 在后臺(tái)運(yùn)行,微信會(huì)在沒有打開的時(shí)候接收消息;
? ? ? ? Suspended:APP 雖然在后臺(tái)運(yùn)行,但是處于休眠狀態(tài),只占用一點(diǎn)內(nèi)存。
2、安卓中任何程序都能在后臺(tái)運(yùn)行,直到?jīng)]有內(nèi)存才會(huì)關(guān)閉
(1)Android 真后臺(tái)運(yùn)行機(jī)制
????????Android 上的應(yīng)用是帶有獨(dú)立虛擬機(jī)的,也就是每開一個(gè)應(yīng)用就會(huì)打開一個(gè)獨(dú)立的虛擬機(jī),每個(gè) APP 都有自己的進(jìn)程,每個(gè)進(jìn)程都有自己的內(nèi)存空間,這樣設(shè)計(jì)的原因是可以避免虛擬機(jī)崩潰導(dǎo)致整個(gè)系統(tǒng)崩潰,但代價(jià)就是需要更多內(nèi)存。以上這些設(shè)計(jì)確保了 Android 的穩(wěn)定性,正常情況下最多單個(gè)程序崩潰,但整個(gè)系統(tǒng)不會(huì)崩潰。
(2)Android 的進(jìn)程從高到低分為5種:
? ? ? ? 前臺(tái)進(jìn)程:正在與用戶交互的進(jìn)程,通俗來講就是你當(dāng)前使用APP 的進(jìn)程;
? ? ? ? 可見進(jìn)程:可以被用戶看到,但是沒有和用戶交互,例如一個(gè) Activity 以對(duì)話框的形式覆蓋在當(dāng)前 Activity 上面,當(dāng)前 Activity 可以被用戶看到,但是不和用戶交互;
? ? ? ? 服務(wù)進(jìn)程:也就是我們常說的 Service ,能夠運(yùn)行在后臺(tái),常見的有音樂類的 APP ;
? ? ? ? 后臺(tái)進(jìn)程:注意,這個(gè)后臺(tái)進(jìn)程不要和服務(wù)器進(jìn)程搞混了,它的意思是說當(dāng)前 APP 在后臺(tái)運(yùn)行,例如我啟動(dòng)了 APP ,然后點(diǎn)擊 Home 鍵返回到桌面,那么這個(gè) APP 就會(huì)被切換到后臺(tái)進(jìn)程;
? ? ? ? 空進(jìn)程:空進(jìn)程指的是在這些進(jìn)程內(nèi)部,沒有任何東西在運(yùn)行。保留這個(gè)進(jìn)程的唯一目的是用作緩存,以縮短該應(yīng)用下次在其中運(yùn)行組件所需的啟動(dòng)時(shí)間。
三、兩者最高權(quán)限指令不同
1、iOS 中用于 UI 指令權(quán)限最高。
2、Android 中數(shù)據(jù)處理指令權(quán)限最高。
四、推送機(jī)制
1、iOS 在軟件關(guān)閉的情況下,依然可以接收推送消息
? ? ? ? 手機(jī)消息當(dāng)然都是通過服務(wù)器推送到我們手機(jī)上的,對(duì)于iOS 的用戶來說,蘋果有 APN 服務(wù)器來負(fù)責(zé)消息的推送。當(dāng)你第一次使用 APP 時(shí),會(huì)詢問是否接收通知,如果你選擇了是,那么服務(wù)器就會(huì)記錄你的 ID ,當(dāng)有消息通知的時(shí)候,這些數(shù)據(jù)是先推送到蘋果的服務(wù)器中,然后通過蘋果的 APN 服務(wù)器推送到用戶手機(jī)上的。這樣的設(shè)計(jì)讓軟件徹底關(guān)閉的時(shí)候還可以接收到消息通知,一方面釋放內(nèi)存,一方面也不會(huì)耽誤接收消息。
2、Android 在軟件關(guān)閉的情況下,無法接收推送消息
? ? ? ? 對(duì) Android 手機(jī)來說,Google 也有類似的 GCM 服務(wù)器來推送消息,不過因?yàn)閲?guó)內(nèi)的手機(jī)都沒有 Google 服務(wù)無法收到 Google GCM 服務(wù)器推送的消息。Android 的推送都是通過服務(wù)來實(shí)現(xiàn)的,就算應(yīng)用沒有啟動(dòng)但是服務(wù)還在一樣可以收到推送。所以只能是 Android 自己?jiǎn)?dòng) Service 來實(shí)現(xiàn)推送,當(dāng)應(yīng)用殺死后 Service 如果被殺死就無法收到推送。
五、渲染機(jī)制不同
Android:主線程普通優(yōu)先級(jí)——加載一個(gè)頁(yè)面,全部加載完成的同時(shí)加載當(dāng)前頁(yè)面,當(dāng)你看到頁(yè)面后,實(shí)際后臺(tái)仍在加載,因此增加了處理器的壓力。
iOS:實(shí)時(shí)優(yōu)先級(jí)——加載整個(gè)頁(yè)面,優(yōu)先加載主屏幕顯示區(qū)域
六、開源性不同
Android:完全開源,任何開發(fā)廠商和開發(fā)者都可開發(fā)安卓的軟件,由于開源,各大品牌手機(jī)硬件差異大,導(dǎo)致體驗(yàn)不同,兼容性不好
iOS:封閉,僅蘋果擁有
七、編程語言不同:
Android:java
IOS:Objective-c
八、升級(jí)應(yīng)用
Android:自動(dòng)升級(jí)應(yīng)用,也可通過應(yīng)用市場(chǎng)來升級(jí)
IOS:需要通過app store升級(jí)
九:軟硬件結(jié)合
Android:由于代碼開源,因此很多開發(fā)廠商都可以根據(jù)自己的設(shè)定來開發(fā)不同的手機(jī),APP不會(huì)針對(duì)各大品牌的手機(jī)專門做優(yōu)化,因此軟硬件結(jié)合差
IOS:由于封閉,因此蘋果一家獨(dú)有專利,所有的APP都針對(duì)IOS做優(yōu)化,因此軟件結(jié)合較好
十、應(yīng)用的刪除操作不同
Android:常見的刪除某一個(gè)操作,用長(zhǎng)按,點(diǎn)擊刪除或者左滑刪除
IOS:很多應(yīng)用都支持左滑刪除操作
十一、獲取日志和簽名方式不同
Android:可通過adb logcat獲取日志,Android studio,DDMS來獲取到日志信息。簽名可以通過jarsigner -verify -certs 包名
IOS:用xcode中debug工具/Itunes高級(jí)功能查看實(shí)時(shí)log,獲取簽名:解壓包取出plist文件,查看應(yīng)用簽名及版本信息,并要檢查證書正確性
十二、分辨率不同
Android:分辨率多達(dá)20多種
IOS:5種
十三、按鍵
Android:底部有3個(gè)按鍵:返回鍵、主菜單、前進(jìn)鍵,在應(yīng)用返回中,都可通過返回鍵回退到上一步
IOS:只有home鍵,所有的應(yīng)用進(jìn)入只有一個(gè)入口,每個(gè)應(yīng)用界面中都有返回出口
總結(jié):
Android:開源、界面好看,但安全性差、漏洞多、穩(wěn)定性差、系統(tǒng)耗電大、流量消耗大
IOS:封閉、安全規(guī)整、用戶體驗(yàn)好