<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                參考另一篇文章[應用基礎知識](http://note.youdao.com/noteshare?id=de140840a1da668b7f2f7f3facb34620) 官方原文——>[應用基礎知識](https://developer.android.com/guide/components/fundamentals.html) Android 應用采用 Java 編程語言編寫。Android SDK 工具將您的代碼 — 連同任何數據和資源文件 — 編譯到一個 APK:Android 軟件包,即帶有 .apk 后綴的存檔文件中。一個 APK 文件包含 Android 應用的所有內容,它是基于 Android 系統的設備用來安裝應用的文件。 安裝到設備后,每個 Android 應用都運行在自己的安全沙箱內: * Android 操作系統是一種多用戶 Linux 系統,其中的每個應用都是一個不同的用戶; * 默認情況下,系統會為每個應用分配一個唯一的 Linux 用戶 ID(該 ID 僅由系統使用,應用并不知曉)。系統為應用中的所有文件設置權限,使得只有分配給該應用的用戶 ID 才能訪問這些文件; * 每個進程都具有自己的虛擬機 (VM),因此應用代碼是在與其他應用隔離的環境中運行; * 默認情況下,每個應用都在其自己的 Linux 進程內運行。Android 會在需要執行任何應用組件時啟動該進程,然后在不再需要該進程或系統必須為其他應用恢復內存時關閉該進程。 Android 系統可以通過這種方式實現最小權限原則。也就是說,默認情況下,每個應用都只能訪問執行其工作所需的組件,而不能訪問其他組件。 這樣便營造出一個非常安全的環境,在這個環境中,應用無法訪問系統中其未獲得權限的部分。 不過,應用仍然可以通過一些途徑與其他應用共享數據以及訪問系統服務: * 可以安排兩個應用共享同一 Linux 用戶 ID,在這種情況下,它們能夠相互訪問彼此的文件。 為了節省系統資源,可以安排具有相同用戶 ID 的應用在同一 Linux 進程中運行,并共享同一 VM(應用還必須使用相同的證書簽署)。 * 應用可以請求訪問設備數據(如用戶的聯系人、短信、可裝載存儲裝置 [SD 卡]、相機、藍牙等)的權限。 用戶必須明確授予這些權限。 如需了解詳細信息,請參閱 使用[系統權限](https://developer.android.com/training/permissions/index.html)。 以上內容闡述了有關 Android 應用在系統內存在方式的基礎知識。本文的其余部分將向您介紹以下內容: * 用于定義應用的核心框架組件 * 您用來聲明組件和應用必需設備功能的清單文件 * 與應用代碼分離并允許您的應用針對各種設備配置適當優化其行為的資源 #### **應用組件** 應用組件是 Android 應用的基本構建基塊。每個組件都是一個不同的點,系統可以通過它進入您的應用。 并非所有組件都是用戶的實際入口點,有些組件相互依賴,但每個組件都以獨立實體形式存在,并發揮特定作用 — 每個組件都是唯一的構建基塊,有助于定義應用的總體行為。 共有四種不同的應用組件類型。每種類型都服務于不同的目的,并且具有定義組件的創建和銷毀方式的不同生命周期。 以下便是這四種應用組件類型: * **Activity** Activity 表示具有用戶界面的單一屏幕。例如,電子郵件應用可能具有一個顯示新電子郵件列表的 Activity、一個用于撰寫電子郵件的 Activity 以及一個用于閱讀電子郵件的 Activity。 盡管這些 Activity 通過協作在電子郵件應用中形成了一種緊密結合的用戶體驗,但每一個 Activity 都獨立于其他 Activity 而存在。 因此,其他應用可以啟動其中任何一個 Activity(如果電子郵件應用允許)。 例如,相機應用可以啟動電子郵件應用內用于撰寫新電子郵件的 Activity,以便用戶共享圖片。 Activity 作為 [Activity](https://developer.android.com/reference/android/app/Activity.html) 的子類實現,您可以在 Activity 開發者指南中了解有關它的更多詳情。 * **服務** 服務是一種在后臺運行的組件,用于執行長時間運行的操作或為遠程進程執行作業。 服務不提供用戶界面。 例如,當用戶位于其他應用中時,服務可能在后臺播放音樂或者通過網絡獲取數據,但不會阻斷用戶與 Activity 的交互。 諸如 Activity 等其他組件可以啟動服務,讓其運行或與其綁定以便與其進行交互。 服務作為 [Service](https://developer.android.com/reference/android/app/Service.html) 的子類實現,您可以在服務開發者指南中了解有關它的更多詳情。 * **內容提供程序** 內容提供程序管理一組共享的應用數據。您可以將數據存儲在文件系統、SQLite 數據庫、網絡上或您的應用可以訪問的任何其他永久性存儲位置。 其他應用可以通過內容提供程序查詢數據,甚至修改數據(如果內容提供程序允許)。 例如,Android 系統可提供管理用戶聯系人信息的內容提供程序。 因此,任何具有適當權限的應用都可以查詢內容提供程序的某一部分(如 [ContactsContract.Data](https://developer.android.com/reference/android/provider/ContactsContract.Data.html)),以讀取和寫入有關特定人員的信息。 內容提供程序也適用于讀取和寫入您的應用不共享的私有數據。 例如,[記事本](https://developer.android.com/resources/samples/NotePad/index.html)示例應用使用內容提供程序來保存筆記。 內容提供程序作為 [ContentProvider](https://developer.android.com/reference/android/content/ContentProvider.html) 的子類實現,并且必須實現讓其他應用能夠執行事務的一組標準 API。 如需了解詳細信息,請參閱[內容提供程序開發者指南](https://developer.android.com/guide/topics/providers/content-providers.html)。 * **廣播接收器** 廣播接收器是一種用于響應系統范圍廣播通知的組件。 許多廣播都是由系統發起的 — 例如,通知屏幕已關閉、電池電量不足或已拍攝照片的廣播。應用也可以發起廣播 — 例如,通知其他應用某些數據已下載至設備,并且可供其使用。 盡管廣播接收器不會顯示用戶界面,但它們可以[創建狀態欄通知](https://developer.android.com/guide/topics/ui/notifiers/notifications.html),在發生廣播事件時提醒用戶。 但廣播接收器更常見的用途只是作為通向其他組件的“通道”,設計用于執行極少量的工作。 例如,它可能會基于事件發起一項服務來執行某項工作。 廣播接收器作為 [BroadcastReceiver](https://developer.android.com/reference/android/content/BroadcastReceiver.html) 的子類實現,并且每條廣播都作為 [Intent](https://developer.android.com/reference/android/content/Intent.html) 對象進行傳遞。 如需了解詳細信息,請參閱 BroadcastReceiver 類。 Android 系統設計的獨特之處在于,任何應用都可以啟動其他應用的組件。 例如,如果您想讓用戶使用設備的相機拍攝照片,很可能有另一個應用可以執行該操作,那么您的應用就可以利用該應用,而不是開發一個 Activity 來自行拍攝照片。 您不需要集成甚至鏈接到該相機應用的代碼,而是只需啟動拍攝照片的相機應用中的 Activity。 完成拍攝時,系統甚至會將照片返回您的應用,以便您使用。對用戶而言,就好像相機真正是您應用的組成部分。 當系統啟動某個組件時,會啟動該應用的進程(如果尚未運行),并實例化該組件所需的類。 例如,如果您的應用啟動相機應用中拍攝照片的 Activity,則該 Activity 會在屬于相機應用的進程,而不是您的應用的進程中運行。因此,與大多數其他系統上的應用不同,Android 應用并沒有單一入口點(例如,沒有 main() 函數)。 由于系統在單獨的進程中運行每個應用,且其文件權限會限制對其他應用的訪問,因此您的應用無法直接啟動其他應用中的組件, 但 Android 系統卻可以。因此,要想啟動其他應用中的組件,您必須向系統傳遞一則消息,說明您想啟動特定組件的 Intent。 系統隨后便會為您啟動該組件。 #### **啟動組件** 四種組件類型中的三種 — Activity、服務和廣播接收器 — 通過名為 Intent 的異步消息進行啟動。Intent 會在運行時將各個組件相互綁定(您可以將 Intent 視為從其他組件請求操作的信使),無論組件屬于您的應用還是其他應用。 Intent 使用 Intent 對象創建,它定義的消息用于啟動特定組件或特定類型的組件 — Intent 可以是顯式的,也可以是隱式的。 對于 Activity 和服務, Intent 定義要執行的操作(例如,“查看”或“發送”某個內容),并且可以指定要執行操作的數據的 URI(以及正在啟動的組件可能需要了解的信息)。 例如, Intent 傳達的請求可以是啟動一個顯示圖像或打開網頁的 Activity。 在某些情況下,您可以啟動 Activity 來接收結果,在這種情況下,Activity 也會在 Intent 中返回結果(例如,您可以發出一個 Intent,讓用戶選取某位聯系人并將其返回給您 — 返回 Intent 包括指向所選聯系人的 URI)。 對于廣播接收器, Intent 只會定義要廣播的通知(例如,指示設備電池電量不足的廣播只包括指示“電池電量不足”的已知操作字符串)。 Intent 不會啟動另一個組件類型 - 內容提供程序,后者會在成為 [ContentResolver](https://developer.android.com/reference/android/content/ContentResolver.html) 的請求目標時啟動。 內容解析程序通過內容提供程序處理所有直接事務,使得通過提供程序執行事務的組件可以無需執行事務,而是改為在 ContentResolver 對象上調用方法。 這會在內容提供程序與請求信息的組件之間留出一個抽象層(以確保安全)。 每種類型的組件有不同的啟動方法: * 您可以通過將 Intent 傳遞到 startActivity() 或 startActivityForResult()(當您想讓 Activity 返回結果時)來啟動 Activity(或為其安排新任務)。 * 您可以通過將 Intent 傳遞到 startService() 來啟動服務(或對執行中的服務下達新指令)。 或者,您也可以通過將 Intent 傳遞到 bindService() 來綁定到該服務。 * 您可以通過將 Intent 傳遞到 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast() 等方法來發起廣播; * 您可以通過在 ContentResolver 上調用 query() 來對內容提供程序執行查詢。 如需了解有關 Intent 用法的詳細信息,請參閱 [Intent 和 Intent 過濾器](https://developer.android.com/guide/components/intents-filters.html)文檔。 以下文檔中還提供了有關啟動特定組件的詳細信息: Activity、服務、BroadcastReceiver 和內容提供程序。 #### **清單文件** 在 Android 系統啟動應用組件之前,系統必須通過讀取應用的 AndroidManifest.xml 文件(“清單”文件)確認組件存在。 您的應用必須在此文件中聲明其所有組件,該文件必須位于應用項目目錄的根目錄中。 除了聲明應用的組件外,清單文件還有許多其他作用,如: * 確定應用需要的任何用戶權限,如互聯網訪問權限或對用戶聯系人的讀取權限 * 根據應用使用的 API,聲明應用所需的最低 [API 級別](https://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels) * 聲明應用使用或需要的硬件和軟件功能,如相機、藍牙服務或多點觸摸屏幕 * 應用需要鏈接的 API 庫(Android 框架 API 除外),如 [Google 地圖庫](http://code.google.com/android/add-ons/google-apis/maps-overview.html) * 其他功能 * **聲明組件** 清單文件的主要任務是告知系統有關應用組件的信息。例如,清單文件可以像下面這樣聲明 Activity: ~~~ <?xml version="1.0" encoding="utf-8"?> <manifest ... > <application android:icon="@drawable/app_icon.png" ... > <activity android:name="com.example.project.ExampleActivity" android:label="@string/example_label" ... > </activity> ... </application> </manifest> ~~~ 在 [`<application>` ](https://developer.android.com/guide/topics/manifest/application-element.html)元素中,android:icon 屬性指向標識應用的圖標所對應的資源。 在 [`<activity>`](https://developer.android.com/guide/topics/manifest/activity-element.html) 元素中,android:name 屬性指定 Activity 子類的完全限定類名,android:label 屬性指定用作 Activity 的用戶可見標簽的字符串。 您必須通過以下方式聲明所有應用組件: * Activity 的 `<activity>` 元素 * 服務的 [`<service>`](https://developer.android.com/guide/topics/manifest/service-element.html) 元素 * 廣播接收器的 [`<receiver>`](https://developer.android.com/guide/topics/manifest/receiver-element.html) 元素 * 內容提供程序的 [`<provider>` ](https://developer.android.com/guide/topics/manifest/provider-element.html)元素 您包括在源代碼中,但未在清單文件中聲明的 Activity、服務和內容提供程序對系統不可見,因此也永遠不會運行。 不過,廣播接收器可以在清單文件中聲明或在代碼中動態創建(如 [BroadcastReceiver](https://developer.android.com/reference/android/content/BroadcastReceiver.html) 對象)并通過調用 registerReceiver() 在系統中注冊。 如需了解有關如何為您的應用構建清單文件的詳細信息,請參閱 [AndroidManifest.xml](https://developer.android.com/guide/topics/manifest/manifest-intro.html) 文件文檔。 * **聲明組件功能** 如上文[啟動組件](https://developer.android.com/guide/components/fundamentals.html#ActivatingComponents)中所述,您可以使用 Intent 來啟動 Activity、服務和廣播接收器。 您可以通過在 Intent 中顯式命名目標組件(使用組件類名)來執行此操作。 不過,Intent 的真正強大之處在于隱式 Intent 概念。 隱式 Intent 的作用無非是描述要執行的操作類型(還可選擇描述您想執行的操作所針對的數據),讓系統能夠在設備上找到可執行該操作的組件,并啟動該組件。 如果有多個組件可以執行 Intent 所描述的操作,則由用戶選擇使用哪一個組件。 系統通過將接收到的 Intent 與設備上的其他應用的清單文件中提供的 Intent 過濾器進行比較來確定可以響應 Intent 的組件。 當您在應用的清單文件中聲明 Activity 時,可以選擇性地加入聲明 Activity 功能的 Intent 過濾器,以便響應來自其他應用的 Intent。 您可以通過將 [<intent-filter>](https://developer.android.com/guide/topics/manifest/intent-filter-element.html) 元素作為組件聲明元素的子項進行添加來為您的組件聲明 Intent 過濾器。 例如,如果您開發的電子郵件應用包含一個用于撰寫新電子郵件的 Activity,則可以像下面這樣聲明一個 Intent 過濾器來響應“send” Intent(以發送新電子郵件): ~~~ <manifest ... > ... <application ... > <activity android:name="com.example.project.ComposeEmailActivity"> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest> ~~~ 然后,如果另一個應用創建了一個包含[ACTION_SEND](https://developer.android.com/reference/android/content/Intent.html#ACTION_SEND) 操作的 Intent,并將其傳遞到 startActivity(),則系統可能會啟動您的 Activity,以便用戶能夠草擬并發送電子郵件。 如需了解有關創建 Intent 過濾器的詳細信息,請參閱 [Intent 和 Intent 過濾器](https://developer.android.com/guide/components/intents-filters.html)文檔。 **聲明應用要求** 基于 Android 系統的設備多種多樣,并非所有設備都提供相同的特性和功能。 為防止將您的應用安裝在缺少應用所需特性的設備上,您必須通過在清單文件中聲明設備和軟件要求,為您的應用支持的設備類型明確定義一個配置文件。 其中的大多數聲明只是為了提供信息,系統不會讀取它們,但 Google Play 等外部服務會讀取它們,以便當用戶在其設備中搜索應用時為用戶提供過濾功能。 例如,如果您的應用需要相機,并使用 Android 2.1(API 級別 7)中引入的 API,您應該像下面這樣在清單文件中以要求形式聲明這些信息: ~~~ <manifest ... > <uses-feature android:name="android.hardware.camera.any" android:required="true" /> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="19" /> ... </manifest> ~~~ 現在,沒有相機且 Android 版本低于 2.1 的設備將無法從 Google Play 安裝您的應用。 不過,您也可以聲明您的應用使用相機,但并不要求必須使用。 在這種情況下,您的應用必須將 [required ](https://developer.android.com/guide/topics/manifest/uses-feature-element.html#required)屬性設置為 "false",并在運行時檢查設備是否具有相機,然后根據需要停用任何相機功能。 [設備兼容性](https://developer.android.com/guide/practices/compatibility.html)文檔中提供了有關如何管理應用與不同設備兼容性的詳細信息。 #### **應用資源** Android 應用并非只包含代碼 — 它還需要與源代碼分離的資源,如圖像、音頻文件以及任何與應用的視覺呈現有關的內容。 例如,您應該通過 XML 文件定義 Activity 用戶界面的動畫、菜單、樣式、顏色和布局。 使用應用資源能夠在不修改代碼的情況下輕松地更新應用的各種特性,并可通過提供備用資源集讓您能夠針對各種設備配置(如不同的語言和屏幕尺寸)優化您的應用。 對于您的 Android 項目中包括的每一項資源,SDK 構建工具都會定義一個唯一的整型 ID,您可以利用它來引用應用代碼或 XML 中定義的其他資源中的資源。 例如,如果您的應用包含一個名為 logo.png 的圖像文件(保存在 res/drawable/ 目錄中),則 SDK 工具會生成一個名為 R.drawable.logo 的資源 ID,您可以利用它來引用該圖像并將其插入您的用戶界面。 提供與源代碼分離的資源的其中一個最重要優點在于,您可以提供針對不同設備配置的備用資源。 例如,通過在 XML 中定義 UI 字符串,您可以將字符串翻譯為其他語言,并將這些字符串保存在單獨的文件中。 然后,Android 系統會根據向資源目錄名稱追加的語言限定符(如為法語字符串值追加 res/values-fr/)和用戶的語言設置,對您的 UI 應用相應的語言字符串。 Android 支持許多不同的備用資源限定符。限定符是一種加入到資源目錄名稱中,用來定義這些資源適用的設備配置的簡短字符串。 再舉一例,您應該經常會根據設備的屏幕方向和尺寸為 Activity 創建不同的布局。 例如,當設備屏幕為縱向(長型)時,您可能想要一種垂直排列按鈕的布局;但當屏幕為橫向(寬型)時,應按水平方向排列按鈕。 要想根據方向更改布局,您可以定義兩種不同的布局,然后對每個布局的目錄名稱應用相應的限定符。 然后,系統會根據當前設備方向自動應用相應的布局。 如需了解有關可以在應用中包括的不同資源類型以及如何針對不同設備配置創建備用資源的詳細信息,請閱讀[提供資源](https://developer.android.com/guide/topics/resources/providing-resources.html)。 繼續閱讀以下方面的內容: **[Intent 和 Intent 過濾器](https://developer.android.com/guide/components/intents-filters.html)** 有關如何使用 Intent API 來啟動應用組件(如 Activity 和服務)以及如何使您的應用組件可供其他應用使用的信息。 **[Activity](https://developer.android.com/guide/components/activities.html)** 有關如何創建 Activity 類實例的信息,該類可在您的應用內提供一個具有用戶界面的獨立屏幕。 **[提供資源](https://developer.android.com/guide/topics/resources/providing-resources.html)** 有關如何通過適當構建 Android 應用來使應用資源與應用代碼分離的信息,包括如何針對特定設備配置提供備用資源。 **[設備兼容性](https://developer.android.com/guide/practices/compatibility.html)** 有關 Android 在不同設備類型上工作方式的信息,并介紹了如何針對不同設備優化您的應用,或如何限制您的應用在不同設備上的可用性。 **[系統權限](https://developer.android.com/guide/topics/security/permissions.html)** 有關 Android 如何通過一種權限系統來限制應用對特定 API 訪問權限的信息,該系統要求征得用戶同意,才允許您的應用使用這些 API
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看