本篇內容主要目的在從整體上了解Android 龐大的系統(tǒng)架構,根據系統(tǒng)架構中的不同模塊和分層找到和梳理一條學習路徑,這樣能更好的切入到不同的模塊學習,直到最后全部打通。
創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機房數據中心構建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)達州電信機房報價,主機托管價格性價比高,為金融證券行業(yè)服務器托管,ai人工智能服務器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
接下來我們從兩個角度來分析
下面這張圖是Android官方提供的一張Android系統(tǒng)的預覽圖。
從上面這個圖中我們可以知道,Android系統(tǒng)一共有5部分組成,他們分別是
從縱向層級架構的角度來看,我們了解了android系統(tǒng)經典5層結構,他們如壘磚一般縱向堆疊在一起。但是其實每一層都包含了大量的子模塊子系統(tǒng),并不能體現出Android整個系統(tǒng)的內部架構、運行機理,以及各個模塊之間是如何銜接與配合工作的。接下來借鑒了gityuan總結的一張系統(tǒng)進程圖,從系統(tǒng)進程的角度來看Android系統(tǒng)的工作原理。
Loader層: 引導kernel啟動
Kernel層: Android內核空間
Native層: 進入用戶空間
Framework層: 給app層提供api以及系統(tǒng)服務,
App層: 各種各樣的應用程序apk
參考文獻:
Google官網將Android服務分為了三種,前臺服務,后臺服務和綁定服務:
前臺服務執(zhí)行一些用戶能注意到的操作。例如,音頻應用會使用前臺服務來播放音頻曲目。前臺服務必須顯示 通知 。即使用戶停止與應用的交互,前臺服務仍會繼續(xù)運行。
后臺服務執(zhí)行用戶不會直接注意到的操作。例如,如果應用使用某個服務來壓縮其存儲空間,則此服務通常是后臺服務。
當應用組件通過調用 bindService() 綁定到服務時,服務即處于 綁定 狀態(tài)。綁定服務會提供客戶端-服務器接口,以便組件與服務進行交互、發(fā)送請求、接收結果,甚至是利用進程間通信 (IPC) 跨進程執(zhí)行這些操作。僅當與另一個應用組件綁定時,綁定服務才會運行。多個組件可同時綁定到該服務,但全部取消綁定后,該服務即會被銷毀。
我個人理解服務可以分為兩種, 前臺 和 后臺 ,而 綁定 應該是被當作一種狀態(tài),因為 前臺服務 和 后臺服務 都可以進行綁定。
基于這個理解,我們將限制分成了前臺和后臺兩個部分:
從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService() ,則系統(tǒng)會拋出異常。為確保應用的安全性,在啟動 Service 時,請始終使用顯式 Intent,且不要為服務聲明 Intent 過濾器。
在后臺中運行的 Service 會消耗設備資源,這可能會降低用戶體驗。 為了緩解這一問題,系統(tǒng)對這些 Service 施加了一些限制。
處于前臺時,應用可以自由創(chuàng)建和運行前臺與后臺 Service。
Android 8.0 開始:系統(tǒng)不允許后臺應用創(chuàng)建后臺 Service。否則該函數將引發(fā)一個 IllegalStateException。
Android 8.0 開始:進入后臺時,在一個持續(xù)數分鐘的時間窗內,應用仍可以創(chuàng)建和使用 Service。 在該時間窗結束后,應用將被視為處于 空閑 狀態(tài)。 此時,系統(tǒng)將停止應用的后臺 Service,就像應用已經調用 Service 的 Service.stopSelf() 方法一樣。
為了解除這種限制,可以使用 JobScheduler 作業(yè)替換后臺 Service。
在 Android 8.0 之前,創(chuàng)建前臺 Service 的方式通常是先創(chuàng)建一個后臺 Service,然后將該 Service 推到前臺。
而在Android 8.0 之后,系統(tǒng)不允許后臺應用創(chuàng)建后臺 Service。
解決方案:調用 startForegroundService() ,以在前臺啟動新 Service。
在系統(tǒng)創(chuàng)建 Service 后,應用有五秒的時間來調用該 Service 的 startForeground() 方法以顯示新 Service 的用戶可見通知。 如果應用在此時間限制內 未 調用 startForeground() ,則系統(tǒng)將停止此 Service 并聲明此應用為 ANR 。
前臺服務必須顯示優(yōu)先級為 PRIORITY_LOW 或更高的 狀態(tài)欄通知 ,這有助于確保用戶知道應用正在執(zhí)行的任務。如果某操作不是特別重要,因而您希望使用最低優(yōu)先級通知,則可能不適合使用服務;相反,您可以考慮使用 計劃作業(yè) 。
在 Android 9 (API 28)之后,使用前臺服務必須申請 FOREGROUND_SERVICE 權限,否則會報 SecurityException 。 這是普通權限,因此,系統(tǒng)會自動為請求權限的應用授予此權限。
每個運行服務的應用都會給系統(tǒng)帶來額外負擔,從而消耗系統(tǒng)資源。如果應用嘗試使用低優(yōu)先級通知隱藏其服務,則可能會降低用戶正在主動交互的應用的性能。因此,如果某個應用嘗試運行擁有最低優(yōu)先級通知的服務,則系統(tǒng)會在抽屜式通知欄的底部調用出該應用的行為。
以 Android 12 為目標平臺的應用在后臺運行時無法再啟動 前臺服務 。
在 Android 11 及以后,系統(tǒng)對前臺服務何時可以訪問設備的位置、攝像頭或麥克風進行了限制。
如果您的應用以 Android 11 或更高版本為目標平臺,且在前臺服務中訪問攝像頭或麥克風,則必須添加 前臺服務類型 camera 和 microphone 。
如果你的應用 在后臺運行時啟動了某項前臺服務 :
如果某服務的功能(位置、麥克風 和 相機)受到了限制,則Logcat中會打印如下語句:
遠程服務 Remote Service 用于android系統(tǒng)內部的應用程序之間
它可以通過自己定義并暴露出來的接口進行程序操作??蛻舳私⒁粋€到服務對象的連接,并通過那個連接來調用服務。連接以調用Context.bindService()方法建立,以調用 Context.unbindService()關閉。多個客戶端可以綁定至同一個服務。如果服務此時還沒有加載,bindService()會先加載它。