[譯] Android應用程式基底礎 >> 應用程式的組件(Application Components)

來源:互聯網
上載者:User

    Android應用程式主要是用Java語言來書寫的。而android提供了一個名為aapt的工具來將編譯完的java二進位檔案(.class)和需要的資料和資源打包成一個apk包。使用者可以在android裝置上安裝這個apk包。一個apk包就被認為是一個應用程式。
 

    從很多角度來看,每一個android應用程式都是存活在一個獨立的環境中的:

    1)每一個應用程式預設是運行在它自己的linux進程中的。 

    2)每一個進程都有一個獨立的虛擬器(VM),所以每一個應用程式相對於其它的應用程式是運行在一個孤島環境中的。

    3)每一個應用程式預設都會被分配一個唯一的linux使用者id號。又因為有許可權的作用,所以應用程式的資源只是對終端使用者和它自身是可見的。當然,也有方法將應用程式的資源暴露給其它的應用程式來使用。
 

    也可能為兩個應用程式分享同一個使用者id號,在這種情況下,它們就能相互訪問彼此的資源。並且處於節省系統資源的目的,被分配相同的使用者的id的多個應用程式可以運行在同一個linux進程中,共用同一個VM。
 

1.應用程式的組件(Application Components
 

    Android的特色之一就是你的應用程式可以使用其它的應用程式的元素(需要提供元素的應用程式允許)。而你的應用程式並不需要包含或連結到提供元素的應用程式,只需要在需要的時候啟動其它應用程式的相應元素。
    為了支援這種特性,當某個應用的元素被其它應用使用的時候,系統需要啟動這個應用程式的進程,並且初始化相應元素的Java對象。所以android應用程式的入口不像其它一些系統上的應用程式只有一個main入口,android應用程式有四種可以被系統在適當時候初始化和啟動並執行核心組件:

 

1)Activity
 

    一個Activity就代表了一個可視化使用者介面,程式中所有的Activity的基類都是android.app.Activity。    每一個Activity都被分配了一個預設的視窗用於繪製。一般情況下,這個視窗會填滿整個螢幕,但是它也可以小於螢幕的大小,浮動在其它視窗的上面。Activity也可以使用其它的視窗――比如顯示在某個Activity正中的彈出對話方塊,或當使用者做了某項操作後,顯示的一個重要訊息。

    可視內容是由View層次樹來表示的。android.view.View是它們的基類。每一個view對象都控制了一個位於視窗範圍內的矩形地區。父view對象包含和組織它的子view對象的布局。位於葉子節點的view對象會在它自身控制的矩形地區內進行繪製,並且對發生在這個地區中的使用者行為進行響應。因此,view是Activity與使用者發生互動的地方。
    將view層次樹的根節點傳入Activity.setContentView()方法,就可以將view層次樹的內容繪製在對應的Activity的視窗中。

 

2)Service

 

    Service組件與使用者介面沒有直接關係,它是在後台啟動並執行。所有的service的基類都是android.app.Service。

    我們可以串連到(綁定)一個正在啟動並執行service(若這個service還沒有運行,則啟動這個service)。一旦串連後,我們就可以利用這個service暴露出來的介面來與這個service來進行互動。

    和其它組件一樣。service運行在應用程式進程的主線程中。所以為了避免阻塞其它組件的運行,service經常會開啟另一個線程來完成一些耗時的工作。

 

3)Broadcast receiver

 

    Broadcast receiver組件用於接收廣播訊息,以及對廣播訊息作出反應。有許多廣播訊息是由系統發出的,但應用程式也可以發出廣播訊息。

    所有的broadcast receiver都是從android.content.BroadcastReceiver繼承下來的。在接收到一個廣播訊息後,你可以啟動一個activity或者顯示一個通知來引起使用者注意。

 

4)Content provider

 

    content provider可以讓你的應用程式的資源暴露給其它的應用程式使用。所有的content provider都是繼承於android.content.ContentProvider。想使用你的應用程式資源的其它應用程式不會直接使用到你的應用程式中的content provider,而是會通過一個android.content.ContentResolver對象來與你的應用程式中的content provider進行互動。可見ContentResolver與content provider的搭配使用可以解決處理序間通訊的問題。

    當發生了一個需要被一個特定的組件來處理的請求的時候,android系統會確保擁有該組件的應用程式進程正在運行,並且會確保該組件的對應的對象是存在的。

 

2.啟用組件:意圖

 

    當ContentResolver發出請求,對應的目標content provider組件會被啟用。而其餘三種組件則是被一種稱為”意圖”的非同步訊息來啟用的。一個意圖訊息就是一個攜帶了資訊的android.content.Intent對象。對於activity和service組件,意圖命名了請求的活動,指定了被操作資料的URI,和一些其它資訊。對於broadcast receiver組件,意圖命名了被廣播的活動。

 

啟用不同的組件需要調用不同的方法:

 

     2.1 啟用activity,需要將一個Intent對象傳入Context.startActivity()方法 或者 Activity.startActivityForResult()方法。被啟用的activity可以調用Activity.getIntent()方法來擷取用於啟用這個activity的Intent對象。若向一個已經處於啟用狀態的activity傳遞了Intent對象,則android系統會調用這個Activity的onNewIntent()方法,並且這個Intent對象傳入。

    若需要從被啟用的activity返回結果,則需要調用Activity.startActivityForResult()方法來啟用那個activity,並重寫之前的那個activity的Activity.onActivityResult()方法。

 

    2.2 將一個Intent對象傳入Context.startService()方法,可以啟用一個service組件(或者給一個正在啟動並執行service組件傳遞新的指令)。Android系統會調用這個service的Service.onStart()方法,並將Intent對象傳入。

    類似的,可以將一個Intent對象傳入Context.bindService()方法來與一個正在啟動並執行service組件建立串連。Android系統會調用這個service組件的Service.onBind()方法,並將Intent對象傳入(若目標service組件還沒有運行,則bindService()方法可以選擇性地啟動目標service組件)。

 

    2.3 將一個Intent對象傳入Context.sendBroadcast(),Context.sendOrderedBroadcast(),或Context.sendStickyBroadcast()方法及其變體方法中,應用程式就可以發起一個通知訊息。Android系統會將這個Intent對象投遞給所有感興趣的broadcast receiver,並調用這些broadcast receiver的BroadcastReceiver.onReceive()方法中。

 

3.關閉組件

 

    如上所說,我們知道不需要自己顯式地去關閉content provider和broadcast receiver組件。

    我們可以調用Activity.finish()方法來關閉這個activity本身。當然,我們也可以調用Activity.finishActivity(int)來關閉自己(此activity是被其它的activity調用Activity.startActivityForResult()方法來啟用的)。

    對於service組件,我們可以調用Service.stopSelf()方法來關閉自身,我們也可以調用Context.stopService(Intent)來關閉service組件。

    另外,在組件不再被使用或Android系統在可用記憶體值較低的情況下,Android系統也可能關閉組件。

 

4.manifest檔案

 

    應用程式需要將自己的組件在manifest檔案中聲明,這樣android系統才能知道組件的存在(Activity,Service和Content provider必須在此檔案中聲明;Broadcast receiver除了可以在此檔案中聲明,也可以通過調用Context.registerReceiver()方法在程式中動態註冊)。在應用程式中,manifest檔案的名字總是AndroidManifest.xml,除了聲明組件,這個檔案還有一些別的作用,比如說說明應用程式連結的額外的庫(既除了android預設連結的庫),說明程式的許可權。

 

    Activity:<activity . . .></activity>

    Service:<service . . .></service>

    Content provider:<provider . . .></provider>

    Broadcast receiver:<receiver . . .></receiver>

 

5.意圖塞選器

 

    Intent對象可以顯式說明目標組件的名字,android就可以通過檢查manifest檔案中聲明的組件名字,找到對應的組件,並啟用它。但Intent對象也可以不指明目標組件的名字,這樣的話android系統就需要將這個Intent對象與manifest檔案中聲明的組件的intent filters(意圖塞選器)來比較,並找到一個最合適的組件,然後啟用這個組件。所以intent filter的作用就是告知android系統此組件能夠處理的intent對象的類型。intent filter也在manifest檔案聲明(一個組件可以沒有,也可以有任意多個intent-filter):

    <intent-filter . . .>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

 

下面這個intent-filter說明某個組件可以處理特定的資料類型

    <intent-filter . . .>
<action android:name="com.example.project.BOUNCE" />
<data android:mimeType="image/jpeg" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

    對於在代碼中動態註冊的broadcast receiver組件,可以聲明android.content.IntentFilter對象來表示一個intent-filter。
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.