2020-09-25 Android基礎(chǔ)知識(shí)-組件(Activity, Service)

應(yīng)用基礎(chǔ)知識(shí)

每個(gè) Android 應(yīng)用都處于各自的安全沙盒中,并受以下 Android 安全功能的保護(hù):

  • Android 操作系統(tǒng)是一種多用戶(hù) Linux 系統(tǒng),其中的每個(gè)應(yīng)用都是一個(gè)不同的用戶(hù);
  • 默認(rèn)情況下,系統(tǒng)會(huì)為每個(gè)應(yīng)用分配一個(gè)唯一的 Linux 用戶(hù) ID(該 ID 僅由系統(tǒng)使用,應(yīng)用并不知曉)。系統(tǒng)會(huì)為應(yīng)用中的所有文件設(shè)置權(quán)限,使得只有分配給該應(yīng)用的用戶(hù) ID 才能訪(fǎng)問(wèn)這些文件;
  • 每個(gè)進(jìn)程都擁有自己的虛擬機(jī) (VM),因此應(yīng)用代碼獨(dú)立于其他應(yīng)用而運(yùn)行。
  • 默認(rèn)情況下,每個(gè)應(yīng)用都在其自己的 Linux 進(jìn)程內(nèi)運(yùn)行。Android 系統(tǒng)會(huì)在需要執(zhí)行任何應(yīng)用組件時(shí)啟動(dòng)該進(jìn)程,然后當(dāng)不再需要該進(jìn)程或系統(tǒng)必須為其他應(yīng)用恢復(fù)內(nèi)存時(shí),其便會(huì)關(guān)閉該進(jìn)程。

應(yīng)用組件

Activity

Activity 是與用戶(hù)交互的入口點(diǎn),它表示擁有界面的單個(gè)屏幕
每個(gè) Activity 都獨(dú)立于其他 Activity 而存在,在權(quán)限允許的情況下,其他應(yīng)用可以啟動(dòng)其中任何一個(gè) Activity
Activity主要的交互有

  • 追蹤用戶(hù)當(dāng)前關(guān)心的內(nèi)容(屏幕上顯示的內(nèi)容),以確保系統(tǒng)繼續(xù)運(yùn)行托管 Activity 的進(jìn)程。
  • 了解先前使用的進(jìn)程包含用戶(hù)可能返回的內(nèi)容(已停止的 Activity),從而更優(yōu)先保留這些進(jìn)程。
  • 幫助應(yīng)用處理終止其進(jìn)程的情況,以便用戶(hù)可以返回已恢復(fù)其先前狀態(tài)的 Activity。
  • 提供一種途徑,讓?xiě)?yīng)用實(shí)現(xiàn)彼此之間的用戶(hù)流,并讓系統(tǒng)協(xié)調(diào)這些用戶(hù)流。(此處最經(jīng)典的示例是共享。)
個(gè)人理解

Activity構(gòu)成了Android應(yīng)用的用戶(hù)界面,與Unity的客戶(hù)端類(lèi)似,但借助Android的機(jī)制,能夠在不同的Activity,不同的應(yīng)用之間進(jìn)行交互

Service

服務(wù)是一個(gè)通用入口點(diǎn),用于因各種原因使應(yīng)用在后臺(tái)保持運(yùn)行狀態(tài)。它是一種在后臺(tái)運(yùn)行的組件,用于執(zhí)行長(zhǎng)時(shí)間運(yùn)行的操作或?yàn)檫h(yuǎn)程進(jìn)程執(zhí)行作業(yè)。服務(wù)不提供界面。諸如 Activity 等其他組件可以啟動(dòng)服務(wù),使該服務(wù)運(yùn)行或綁定到該服務(wù),以便與其進(jìn)行交互。綁定服務(wù)之所以能運(yùn)行,原因是某些其他應(yīng)用(或系統(tǒng))已表示希望使用該服務(wù)。從根本上講,這是為另一個(gè)進(jìn)程提供 API 的服務(wù)。因此,系統(tǒng)會(huì)知曉這些進(jìn)程之間存在依賴(lài)關(guān)系,所以如果進(jìn)程 A 綁定到進(jìn)程 B 中的服務(wù),系統(tǒng)便知道自己需使進(jìn)程 B(及其服務(wù))為進(jìn)程 A 保持運(yùn)行狀態(tài)。此外,如果進(jìn)程 A 是用戶(hù)關(guān)心的內(nèi)容,系統(tǒng)隨即也知道將進(jìn)程 B 視為用戶(hù)關(guān)心的內(nèi)容。由于存在靈活性(無(wú)論好壞),服務(wù)已成為非常有用的構(gòu)建塊,并且可實(shí)現(xiàn)各種高級(jí)系統(tǒng)概念。動(dòng)態(tài)壁紙、通知偵聽(tīng)器、屏幕保護(hù)程序、輸入方法、無(wú)障礙功能服務(wù)以及眾多其他核心系統(tǒng)功能均可構(gòu)建為在其運(yùn)行時(shí)由應(yīng)用實(shí)現(xiàn)、系統(tǒng)綁定的服務(wù)

BroadCastReceiver

借助廣播接收器組件,系統(tǒng)能夠在常規(guī)用戶(hù)流之外向應(yīng)用傳遞事件,從而允許應(yīng)用響應(yīng)系統(tǒng)范圍內(nèi)的廣播通知。由于廣播接收器是另一個(gè)明確定義的應(yīng)用入口,因此系統(tǒng)甚至可以向當(dāng)前未運(yùn)行的應(yīng)用傳遞廣播。例如,應(yīng)用可通過(guò)調(diào)度提醒來(lái)發(fā)布通知,以告知用戶(hù)即將發(fā)生的事件。而且,通過(guò)將該提醒傳遞給應(yīng)用的廣播接收器,應(yīng)用在提醒響起之前即無(wú)需繼續(xù)運(yùn)行。許多廣播均由系統(tǒng)發(fā)起,例如,通知屏幕已關(guān)閉、電池電量不足或已拍攝照片的廣播。應(yīng)用也可發(fā)起廣播,例如,通知其他應(yīng)用某些數(shù)據(jù)已下載至設(shè)備,并且可供其使用。盡管廣播接收器不會(huì)顯示界面,但其可以創(chuàng)建狀態(tài)欄通知在發(fā)生廣播事件時(shí)提醒用戶(hù)。但廣播接收器更常見(jiàn)的用途只是作為通向其他組件的通道,旨在執(zhí)行極少量的工作。

個(gè)人理解

通過(guò)應(yīng)用的BroadCastReceiver,使應(yīng)用能夠接受來(lái)自其他應(yīng)用或者系統(tǒng)的消息,并且能夠在狀態(tài)欄等地方展示。它多用于通知與提醒方面。

ContentProvider

內(nèi)容提供程序管理一組共享的應(yīng)用數(shù)據(jù),您可以將這些數(shù)據(jù)存儲(chǔ)在文件系統(tǒng)、SQLite 數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)中或者您的應(yīng)用可訪(fǎng)問(wèn)的任何其他持久化存儲(chǔ)位置。其他應(yīng)用可通過(guò)內(nèi)容提供程序查詢(xún)或修改數(shù)據(jù)(如果內(nèi)容提供程序允許)。我們很容易將內(nèi)容提供程序看作數(shù)據(jù)庫(kù)上的抽象,因?yàn)槠鋬?nèi)置的大量 API 和支持時(shí)常適用于這一情況。但從系統(tǒng)設(shè)計(jì)的角度看,二者的核心目的不同。對(duì)系統(tǒng)而言,內(nèi)容提供程序是應(yīng)用的入口點(diǎn),用于發(fā)布由 URI 架構(gòu)識(shí)別的已命名數(shù)據(jù)項(xiàng)。因此,應(yīng)用可以決定如何將其包含的數(shù)據(jù)映射到 URI 命名空間,進(jìn)而將這些 URI 分發(fā)給其他實(shí)體

個(gè)人理解

應(yīng)用的存儲(chǔ)組件,負(fù)責(zé)管理共享的應(yīng)用數(shù)據(jù)。在ContentProvider允許的情況下,能夠讓其他應(yīng)用查詢(xún)與修改數(shù)據(jù)。ContentProvider也適用于私有數(shù)據(jù)

啟動(dòng)組件

在四種組件類(lèi)型中,有三種(Activity、服務(wù)和廣播接收器)均通過(guò)異步消息 Intent 進(jìn)行啟動(dòng)。Intent 會(huì)在運(yùn)行時(shí)對(duì)各個(gè)組件進(jìn)行互相綁定??梢詫?Intent 視為從其他組件請(qǐng)求操作的信使
使用Intent對(duì)象創(chuàng)建intent
對(duì)于A(yíng)ctivity和Service,Intent 可能會(huì)傳達(dá)對(duì) Activity 的請(qǐng)求,可以通過(guò)啟動(dòng) Activity 來(lái)接收結(jié)果,這樣 Activity 還會(huì)返回 Intent中的結(jié)果
對(duì)于BroadCastReceiver,Intent 只會(huì)定義待廣播的通知。例如,指示設(shè)備電池電量不足的廣播只包含指示“電池電量不足”的已知操作字符串
對(duì)于ContentProvider,Content會(huì)在成為ContentResolver的目標(biāo)時(shí)啟動(dòng)

AndroidManifast.xml

在 Android 系統(tǒng)啟動(dòng)應(yīng)用組件之前,系統(tǒng)必須通過(guò)讀取應(yīng)用的清單文件 (AndroidManifest.xml) 確認(rèn)組件存在,應(yīng)用必須在此文件中聲明其所有組件,該文件必須位于應(yīng)用項(xiàng)目目錄的根目錄中
除了聲明應(yīng)用的組件外,清單文件還有許多其他作用,如:

  • 確定應(yīng)用需要的任何用戶(hù)權(quán)限,如互聯(lián)網(wǎng)訪(fǎng)問(wèn)權(quán)限或?qū)τ脩?hù)聯(lián)系人的讀取權(quán)限
  • 聲明應(yīng)用使用或需要的硬件和軟件功能,如相機(jī)、藍(lán)牙服務(wù)或多點(diǎn)觸摸屏幕
  • 根據(jù)應(yīng)用使用的 API,聲明應(yīng)用所需的最低API級(jí)別
  • 聲明應(yīng)用需要鏈接的 API 庫(kù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容