Android應用的基礎知識

前言

本篇文章講述的是android應用的基礎知識,可以讓你對android程序有更好的認識,我們學習一項技能一定要在他的官網上學習,這能保證知識的正確性和完整性。

簡述

對於android開發者你可以使用Kotlin,Java和C++語言來編寫android程序,SDK工具會將你代碼同鏈接的任何數據和資源文件編譯成一個apk文件,即帶有.apk的後綴件,一個apk文件包含android應用的所有的內容,他也是android的安裝文件。
每一個android應用都處於各自的安全的沙盒中,並受一下android安全功能保護

  1. android操作系統是一種對用戶的Linux系統,其中每個應用都是不同的用戶。
  2. 默認情況下,系統會爲每個應用分配一個唯一的Linux用戶ID,系統會爲應用中的所有的文件設置權限,使得只有分配給該應用的用戶ID才能訪問這些文件。
  3. 每個進程都擁有自己的虛擬機 (VM),因此應用代碼獨立於其他應用而運行。
  4. 默認情況下,每個應用都在其自己的 Linux 進程內運行。Android 系統會在需要執行任何應用組件時啓動該進程,然後當不再需要該進程或系統必須爲其他應用恢復內存時,其便會關閉該進程。

Android 系統實現了最小權限原則。換言之,默認情況下,每個應用只能訪問執行其工作所需的組件,而不能訪問其他組件。這樣便能創建非常安全的環境,在此環境中,應用無法訪問其未獲得權限的系統部分。不過,應用仍可通過一些途徑與其他應用共享數據以及訪問系統服務:

  • 可以安排兩個應用共享一個Linux用戶ID,再此情況下二者能訪問彼此的文件,爲了節省資源,也可以安排擁有相同的用戶ID的應用在同一個Linux進程中運行,並共享一個JVM,應用還必須使用相同的證書進行簽名。

應用組件

應用組件是Android應用的基本構建塊,每個組件都是一個入口點,系統或用戶通過該入口點進入您的應用。有些組件依賴別的組件。

組件分類

android的組件分爲 Activity,服務,廣播接收器,內容提供程序,每個類型都有不同的聲明週期和用途

Activity

Activity 是與用戶交互的入口點。它表示擁有界面的單個屏幕。例如,電子郵件應用可能有一個顯示新電子郵件列表的 Activity、一個用於撰寫電子郵件的 Activity 以及一個用於閱讀電子郵件的 Activity。儘管這些 Activity 通過協作在電子郵件應用中形成一種緊密結合的用戶體驗,但每個 Activity 都獨立於其他 Activity 而存在。因此,其他應用可以啓動其中任何一個 Activity(如果電子郵件應用允許)。例如,相機應用可以啓動電子郵件應用內用於撰寫新電子郵件的 Activity,以便用戶共享圖片。Activity 有助於完成系統和應用程序之間的以下重要交互:

  • 追蹤當前的用戶關心的信息,以確保系統繼續運行託管Activity的進程
  • 瞭解先前使用的進程包含用戶可能返回的內容,從而更優先的保留這些進程。
  • 幫助應用處理終止其進程的情況,一遍用戶可以返回已恢復其先前的activity的狀態。
  • 提供一種途徑,讓應用實現彼此之間的用戶流,並讓系統協調這些用戶流。
服務

服務是一個通用的入口點,用於因各種原因應用在後臺保持運行狀態,是一種在後臺運行的組件,用於執行長時間運行的操作或者爲遠程進程執行作業,服務不提供界面。例如,當用戶使用其他的應用時,服務可能會在後臺播放音樂或者通過網絡獲取數據,但這不會阻斷用戶與 Activity 的交互。諸如 Activity 等其他組件可以啓動服務,使該服務運行或綁定到該服務,以便與其進行交互。事實上,有兩種截然不同的語義服務可以告知系統如何管理應用:已啓動服務會告知系統使其運行至工作完畢。此類工作可以是在後臺同步一些數據,或者在用戶離開應用後繼續播放音樂。在後臺同步數據或播放音樂也代表了兩種不同類型的已啓動服務,而這些服務可以修改系統處理它們的方式:

  • 音樂播放是用戶可直接感知的服務,因此,應用會向用戶發送通知,表明其希望成爲前臺,從而告訴系統此消息;在此情況下,系統明白它應盡全力維持該服務進程運行,因爲進程消失會令用戶感到不快。
  • 通常,用戶不會意識到常規後臺服務正處於運行狀態,因此係統可以更自由地管理其進程。如果系統需要使用 RAM 來處理用戶更迫切關注的內容,則其可能允許終止服務(然後在稍後的某個時刻重啓服務)。

綁定服務之所以能運行,原因是某些其他應用(或系統)已表示希望使用該服務。從根本上講,這是爲另一個進程提供 API 的服務。因此,系統會知曉這些進程之間存在依賴關係,所以如果進程 A 綁定到進程 B 中的服務,系統便知道自己需使進程 B(及其服務)爲進程 A 保持運行狀態。此外,如果進程 A 是用戶關心的內容,系統隨即也知道將進程 B 視爲用戶關心的內容。由於存在靈活性(無論好壞),服務已成爲非常有用的構建塊,並且可實現各種高級系統概念。動態壁紙、通知偵聽器、屏幕保護程序、輸入方法、無障礙功能服務以及衆多其他核心系統功能均可構建爲在其運行時由應用實現、系統綁定的服務。

廣播接收器

藉助廣播接收器組件,系統能夠在常規用戶流之外向應用傳遞事件,從而允許應用響應系統範圍內的廣播通知。由於廣播接收器是另一個明確定義的應用入口,因此係統甚至可以向當前未運行的應用傳遞廣播。例如,應用可通過調度提醒來發布通知,以告知用戶即將發生的事件。而且,通過將該提醒傳遞給應用的廣播接收器,應用在提醒響起之前即無需繼續運行。許多廣播均由系統發起,例如,通知屏幕已關閉、電池電量不足或已拍攝照片的廣播。應用也可發起廣播,例如,通知其他應用某些數據已下載至設備,並且可供其使用。儘管廣播接收器不會顯示界面,但其可以創建狀態欄通知,在發生廣播事件時提醒用戶。但廣播接收器更常見的用途只是作爲通向其他組件的通道,旨在執行極少量的工作。例如,它可能會根據帶 JobScheduler 的事件調度 JobService 來執行某項工作

內容提供程序

內容提供程序管理一組共享的應用數據,您可以將這些數據存儲在文件系統、SQLite 數據庫、網絡中或者您的應用可訪問的任何其他持久化存儲位置。其他應用可通過內容提供程序查詢或修改數據(如果內容提供程序允許)。例如,Android 系統可提供管理用戶聯繫人信息的內容提供程序。因此,任何擁有適當權限的應用均可查詢內容提供程序(如 ContactsContract.Data),以讀取和寫入特定人員的相關信息。我們很容易將內容提供程序看作數據庫上的抽象,因爲其內置的大量 API 和支持時常適用於這一情況。但從系統設計的角度看,二者的核心目的不同。對系統而言,內容提供程序是應用的入口點,用於發佈由 URI 架構識別的已命名數據項。因此,應用可以決定如何將其包含的數據映射到 URI 命名空間,進而將這些 URI 分發給其他實體。反之,這些實體也可使用分發的 URI 來訪問數據。在管理應用的過程中,系統可以執行以下特殊操作:

  • 分配 URI 無需應用保持運行狀態,因此 URI 可在其所屬的應用退出後繼續保留。當系統必須從相應的 URI 檢索應用數據時,系統只需確保所屬應用仍處於運行狀態。
  • 這些 URI 還會提供重要的細粒度安全模型。例如,應用可將其所擁有圖像的 URI 放到剪貼板上,但將其內容提供程序鎖定,以便其他應用程序無法隨意訪問它。當第二個應用嘗試訪問剪貼板上的 URI 時,系統可允許該應用通過臨時的 URI 授權來訪問數據,這樣便只能訪問 URI 後面的數據,而非第二個應用中的其他任何內容。

內容提供程序也適用於讀取和寫入您的應用不共享的私有數據。

內容提供程序作爲 ContentProvider 的子類實現,並且其必須實現一組標準 API,以便其他應用能夠執行事務。如需瞭解詳細信息,請參閱內容提供程序開發者指南。

啓動組件

在四種組件類型中,有三種(Activity、服務和廣播接收器)均通過異步消息 Intent 進行啓動。Intent 會在運行時對各個組件進行互相綁定。您可以將 Intent 視爲從其他組件(無論該組件是屬於您的應用還是其他應用)請求操作的信使。

您需使用 Intent 對象創建 Intent,該對象通過定義消息來啓動特定組件(顯式 Intent)或特定的組件類型(隱式 Intent)。

對於 Activity 和服務,Intent 會定義要執行的操作(例如,查看或發送某內容),並且可指定待操作數據的 URI,以及正在啓動的組件可能需要了解的信息。例如,Intent 可能會傳達對 Activity 的請求,以便顯示圖像或打開網頁。在某些情況下,您可以通過啓動 Activity 來接收結果,這樣 Activity 還會返回 Intent 中的結果。例如,您可以發出一個 Intent,讓用戶選取某位聯繫人並將其返回給您。返回 Intent 包含指向所選聯繫人的 URI。

對於廣播接收器,Intent 只會定義待廣播的通知。例如,指示設備電池電量不足的廣播只包含指示“電池電量不足”的已知操作字符串。

與 Activity、服務和廣播接收器不同,內容提供程序並非由 Intent 啓動。相反,它們會在成爲 ContentResolver 的請求目標時啓動。內容解析程序會通過內容提供程序處理所有直接事務,因此通過提供程序執行事務的組件便無需執行事務,而是改爲在 ContentResolver 對象上調用方法。這會在內容提供程序與請求信息的組件之間留出一個抽象層(以確保安全)

每種組件都有不同的啓動方法:

  • 如要啓動 Activity,您可以向 startActivity() 或 startActivityForResult() 傳遞 Intent(當您想讓 Activity 返回結果時),或者爲其安排新任務。
  • 在 Android 5.0(API 級別 21)及更高版本中,您可以使用 JobScheduler 類來調度操作。對於早期 Android 版本,您可以通過向 startService() 傳遞 Intent 來啓動服務(或對執行中的服務下達新指令)。您也可通過向將 bindService() 傳遞 Intent 來綁定到該服務。
  • 您可以通過向 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法傳遞 Intent 來發起廣播。
  • 您可以通過在 ContentResolver 上調用 query(),對內容提供程序執行查詢。
清單文件

在 Android 系統啓動應用組件之前,系統必須通過讀取應用的清單文件 (AndroidManifest.xml) 確認組件存在。您的應用必須在此文件中聲明其所有組件,該文件必須位於應用項目目錄的根目錄中。

應用資源

Android 應用並非僅包含代碼,它還需要與源代碼分離的資源,如圖像、音頻文件以及任何與應用的視覺呈現有關的內容。例如,您可以通過 XML 文件定義 Activity 界面的動畫、菜單、樣式、顏色和佈局。藉助應用資源,您無需修改代碼即可輕鬆更新應用的各種特性。通過提供備用資源集,您可以針對各種設備配置(如不同的語言和屏幕尺寸)優化您的應用。

對於您在 Android 項目中加入的每一項資源,SDK 構建工具均會定義唯一的整型 ID,您可以利用此 ID 來引用資源,這些資源或來自應用代碼,或來自 XML 中定義的其他資源。例如,如果您的應用包含名爲 logo.png 的圖像文件(保存在 res/drawable/ 目錄中),則 SDK 工具會生成名爲 R.drawable.logo 的資源 ID。此 ID 映射到應用特定的整型數,您可以利用它來引用該圖像,並將其插入您的界面。

如果提供與源代碼分離的資源,則其中最重要的一個優點在於,您可以提供適用於不同設備配置的備用資源。例如,通過在 XML 中定義界面字符串,您可以將字符串翻譯爲其他語言,並將這些字符串保存在單獨的文件中。然後,Android 系統會根據向資源目錄名稱追加的語言限定符(如爲法語字符串值追加 res/values-fr/)和用戶的語言設置,對您的界面應用相應的語言字符串。

Android 支持許多不同的備用資源限定符。限定符是資源目錄名稱中加入的短字符串,用於定義這些資源適用的設備配置。例如,您應根據設備的屏幕方向和尺寸爲 Activity 創建不同的佈局。當設備屏幕爲縱向(長型)時,您可能想要一種垂直排列按鈕的佈局;但當屏幕爲橫向(寬型)時,可以按水平方向排列按鈕。如要根據方向更改佈局,您可以定義兩種不同的佈局,然後對每個佈局的目錄名稱應用相應的限定符。然後,系統會根據當前設備方向自動應用相應的佈局。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章