Android開發系列_手把手開發APP_002_Android四大件

我們拿到一部安卓手機。想想原理。
1.手機由硬件+軟件構成。
2.手機軟件:
系統軟件由谷歌+手機廠商提供
應用軟件由開發者提供
3.系統軟件:
linux內核+谷歌皮膚。
linux可以執行二進制文件。
Android最初應用默認使用Java開發,Java-> .class,交給虛擬機運行。
Android爲了兼容老式設備,必須要提供高性能的虛擬機。
Android打通軟件市場,爲了提高系統競爭力,需要做優化。Java語言達不到效率最高,C++是面向對象的,編譯後可以得到二進制。C++就被加入進來了。
4.Android=linux kernel + 應用層API。
5.應用層API設計的時候,時時刻刻關注內核。因此linux的一些特性Android必定支持。
6.linux支持多用戶,最典型的。
每個 Android 應用都處於各自的安全沙盒中。
7.Android 應用的應用ID.
8.Android 應用運行在單獨的VM線程中。
9.linux中sam創建的文件會蓋上sam的時間戳。tom不可以訪問。
不過可以appA.id = appB.id = 1使A,B可以交換數據。
10.Android中的數據結構:

  • Activity
  • Service
  • Brocast Receive
  • Content Provider

重點關注用途&生命週期

Activity 是與用戶交互的入口點
它表示擁有界面的單個屏幕
怎樣讓B activity和A activity同時運行?
點擊A的button,B跳出來,但並沒有完全遮住A的內容。
Activity 有助於完成系統和應用程序之間的以下重要交互:
追蹤屏幕上顯示的內容,以確保系統繼續運行託管 Activity 的進程。這是個回調函數。
Service是一個通用入口點
因各種原因使應用在後臺保持運行狀態
它是一種在後臺運行的組件,用於執行長時間運行的操作或爲遠程進程執行作業。
它是守護進程。
服務不提供界面。
Service是在應用失焦後,使APP後臺處理任務的一種結構。
eg:音樂播放
BroadCast Receiver
藉助廣播接收器,系統可以向任何應用傳遞消息。
這裏的任何應用也可以指沒有運行的應用。
eg:調度提醒來發布通知,以告知用戶即將發生的事件。
eg2:屏幕關閉,系統像遊戲應用傳遞消息,遊戲應用切換會阻塞狀態。
eg3:電池電量<20%,系統提醒,同時調節屏幕亮度。
ContentProvider
管理共享的應用數據。
這些數據的來源可以是:File System、SQLite、網絡...
應用可通過這個數據結構來獲取本機數據,包括自己的和別人的。
思考?內容提供者的level是什麼?
內容提供者不等同與數據庫。相反,應用只有通過它纔可以獲取應用的所有數據,它應該作爲View空間初始化結束後第一該初始化的類。
而Android系統也正是這樣。通過R.id.XXX來獲取資源,稱作URI,找尋Content provider內置的數據項。
現在,我打開QQ。
Activity類被實例化。QQ被VM隔離,與其他APP保持安全舉例,如微信。
當啓動QQ時,會出現歡迎界面。顯示QQ的版本號並啓動service。update service...
我向朋友發送照片,我打開相機,此時,相機的activity被運行在它的VM中。
QQ進程回到繼續態,相機Activity獲得焦點,在CPU中運行。
當拍照好了之後,通過ContentProvider來獲取拍好的照片,你覺得可以,就點擊發送。此時經過udp的協議,
qq的服務器收到了你的消息,qq的服務器解碼,查出你好友的qq客戶端的ip和端口,併發送。
你好友恰好也用安卓手機。
他的手機qq的會發送broadcast,系統組件顯示qq發來了新的消息。
回想細節:qq客戶端使用相機,是兩個APP.
qq通過像系統申請,使系統啓動另一個組件。
明白這點將是下面的重點.

11.啓動組件

在四種組件類型中,有三種(Activity、服務和廣播接收器)均通過異步消息 Intent 進行啓動。Intent 會在運行時對各個組件進行互相綁定。。

intent就是信使。APP a想呼叫APP b,通過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(),對內容提供程序執行查詢。
    12.在 Android 系統啓動應用組件之前,系統必須通過讀取應用的清單文件 (AndroidManifest.xml) 確認組件存在
    除了聲明應用的組件外,清單文件還有許多其他作用,如:
  • 確定應用需要的任何用戶權限,如互聯網訪問權限或對用戶聯繫人的讀取權限。
  • 根據應用使用的 API,聲明應用所需的最低 API 級別
  • 聲明應用使用或需要的硬件和軟件功能,如相機、藍牙服務多點觸摸屏幕
  • 聲明應用需要鏈接的 API 庫(Android 框架 API 除外),如 Google 地圖庫。
    13.在androidmanifest.xml中聲明組件:
<?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>

android:name 屬性指定 Activity 子類的完全限定類名,
android:label 屬性指定用作 Activity 的用戶可見標籤的字符串
android:icon 屬性指向標識應用的圖標所對應的資源。
14.在androidmanifest.xml中聲明組件:

  • Activity 的 元素。
  • 服務的 元素。
  • 廣播接收器的 元素。
  • 內容提供程序的 元素。

如果未在清單文件中聲明源代碼中包含的 Activity、服務和內容提供程序,則這些組件對系統不可見,因此也永遠不會運行
不過,您可以 BroadcastReceiver 對象的形式,在清單中聲明或在代碼中動態創建廣播接收器;以及通過調用 registerReceiver(),在系統中註冊廣播接收器。
15.聲明組件功能
如上文啓動組件中所述,您可以使用 Intent 來啓動 Activity、服務和廣播接收器。
您可以通過在 Intent 中顯式命名目標組件(使用組件類名)來使用 Intent。
您還可使用隱式 Intent,通過它來描述要執行的操作類型和待操作數據(可選)。
藉助隱式 Intent,系統能夠在設備上找到可執行該操作的組件,並啓動該組件。如果有多個組件可以執行 Intent 所描述的操作,則由用戶選擇使用哪一個組件

注意:如果您使用 Intent 來啓動 Service,請使用顯式 Intent 來確保應用的安全性。使用隱式 Intent 啓動服務存在安全隱患,因爲您無法確定哪些服務將響應 Intent,且用戶無法看到哪些服務已啓動。從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService(),系統會拋出異常。請勿爲您的服務聲明 Intent 過濾器。

通過將收到的 Intent 與設備上其他應用的清單文件中提供的 Intent 過濾器進行比較,系統便可識別能響應 Intent 的組件。

在應用的清單文件中聲明 Activity 時,您可以選擇性地加入聲明 Activity 功能的 Intent 過濾器,以便響應來自其他應用的 Intent。
您可以將 元素作爲組件聲明元素的子項進行添加,從而爲您的組件聲明 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 操作的 Intent 並將其傳遞到 startActivity(),則系統可能會啓動您的 Activity,以便用戶能夠草擬併發送電子郵件。

如需瞭解有關創建 Intent 過濾器的詳細信息,請參閱 Intent 和 Intent 過濾器文檔。
16.聲明應用要求
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 屬性設置爲 false,並在運行時檢查設備是否擁有相機,然後根據需要停用任何相機功能
也就是說不想在聲明文件中聲明硬件必須的條件,爲了不讓你的應用出bug,你得自己做代碼的判斷。
16.應用資源
Android 應用並非僅包含代碼,它還需要與源代碼分離的資源,如圖像音頻文件以及任何與應用的視覺呈現有關的內容。例如,您可以通過 XML 文件定義 Activity 界面的動畫、菜單、樣式、顏色和佈局。藉助應用資源,您無需修改代碼即可輕鬆更新應用的各種特性。通過提供備用資源集,您可以針對各種設備配置(如不同的語言和屏幕尺寸)優化您的應用。

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

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