Android應用程式的五大基本組件

來源:互聯網
上載者:User

一、Activity —— 應用展示層( 基類 Activity )

        一個活動表示一個可視化的使用者介面,關注一個使用者從事的事件。例如,一個活動可能表示一個使用者可選擇的功能表項目列表,或者可能顯示照片連同它的標題。一個文本簡訊應用程式可能有一個活動,顯示連絡人的名單發送資訊;第二個活動,寫資訊給選定的連絡人;其他活動,重新查看舊資訊或更改設定。雖然他們一起工作形成一個整體的使用者介面,但是每個活動是獨立於其他活動的。每一個都是作為Activity基類的一個子類的實現。

       應用程式中的每個螢幕都是通過繼承和擴充基類 Activity 來實現的。  

       同一應用中的每個 Activity 是相互獨立的。程式啟動後顯示的第一幅畫面是應用程式的第一個 Activity (預設視窗),而後可以根據需要從這個 Activity 啟動另一個新的 Activity 。  

       Activity 利用 View 來實現應用中的 GUI (使用者直接通過 GUI 和應用程式做互動)。 Activity 視窗內的可見內容通過基類 View 提供。使用 Activity.setContentView() 方法設定當前 Activity 中的 View 對象。

l          每個 View 對象控制著視窗內的一個矩形空間;

l          View 是一種層次化結構, Parent View 中的布局屬性會被子 View 繼承;

l          位於 View 層次關係最底層的子 View 對象所代表的矩形空間就是跟使用者進行互動的地方

 

Activity 狀態回調:

l          onCreate

l          onStart

l          onRestart

l          onResume

l          onPause

l          onStop

l          onDestroy

 

二、Service —— 沒有可見的使用者介面,但能夠長時間運行於後台( 基類 Service )

      一個服務沒有一個可視化使用者介面,而是在後台無期限地運行。例如一個服務可能是播放背景音樂而使用者做其他一些事情,或者它可能從網路擴取資料,或計算一些東西並提供結果給需要的活動(activities)。每個服務都繼承自Service基類。

       運行於應用程式進程的主線程中,因此 Service 不會阻塞其他組件和使用者介面。

       Service 是不能自己啟動的,必須通過 Context 對象(如一個 Activity )調用 startService 或 bindService 方法來啟動(用這兩種方法啟動的 Service 的生命週期不同)。

1.          調用 startService 方法

a)          若 Service 沒有啟動,則首先會調用該 Service 的 onCreate 方法,然後再調用 onStart 方法。

b)         若 Service 已經啟動,則會直接調用 onStart 方法

c)         該方法啟動的 Service ,可以通過 Context 對象調用 stopService 來關閉,也可以通過 Service 自身調用 stopSelf() 或 stopSelfResult() 來關閉,關閉之前調用 onDestory 方法。

2.          調用 bindService 方法,使當前 Context 對象通過一個 ServiceConnection 的對象綁定到所指定的 Service

a)          若 Service 沒有啟動,則首先會調用該 Service 的 onCreate 方法初始化啟動,然後調用 Service 的 onBind 方法初始化綁定。

b)         如果綁定 Service 的 Context 對象被銷毀時,被綁定的 Service 也會調用 onUnbind 和 onDestroy 方法停止運行

c)         注意: BroadcastReceiver 是不能綁定服務的。

d)         一個綁定 Service 的 Context 對象還可以通過 unbindService() 來取消對服務的綁定。

e)          取消時, Service 會調用 unbind 方法,若 Service 是通過 bindService 來啟動的,還會調用 onDestroy 方法來停止服務。

       Service 狀態回調:

l          onCreate

l          onStart

l          onBind

l          onRebind

l          onUnbind

l          onDestroy

 

三、Broadcast Receiver —— 使用者接收廣播通知的組件( 基類 BroadcastReceiver )

       一個廣播接收者是這樣一個組件,它不做什麼事,僅是接受廣播公告並作出相應的反應。許多廣播源自於系統代碼,例如公告時區的改變、電池電量低、已採取圖片、使用者改變了語言偏好。應用程式也可以發起廣播,例如為了他其他程式知道某些資料已經下載到裝置且他們可以使用這些資料。一個應用程式可以有任意數量的廣播接收者去反應任何它認為重要的公告。所有的接受者繼承自BroadcastReceiver基類。

       Android 中的廣播要麼來自於系統,要麼來自普通應用程式。

很多事件都可能導致系統廣播,如手機所在時區發生變化,電池電量低,使用者改變系統語言設定等。

來自普通應用程式,如一個代理程式更新其他應用程式某些資料已經下載完畢。

       為了響應不同的事件通知,應用程式可以註冊不同的 Broadcast Receiver 。所有的 Broadcast Receiver 都繼承自基類 BroadcastReceiver 。

       BroadcastReceiver 自身並不實現圖形化使用者介面,但是當它收到某個通知後, BroadcastReceiver 可以啟動 Activity 作為響應,或者通過 NotificationMananger 提醒使用者。

       BroadcastReceiver 是對發送出來的 Broadcast 進行過濾接收並響應的一類組件。

 

       發送 Broadcast 資訊

1.          把要發送的資訊和用於過濾得資訊 ( 如 Action 、 Category) 裝入一個 Intent 對象

2.          調用 Context. sendBroadcast() 、 sendOrderBroadcast() 、 sendStickyBroadcast() 方法,廣播該 Intent 對象

3.          使用 sendBroadcast() 或 sendStickyBroadcast() 方法發出去的 Intent ,所有滿足條件的 BroadcastReceiver 都會隨機地執行其 onReceive() 方法;

4.          而 sendOrderBroadcast() 發出去的 Intent ,會根據 BroadcastReceiver 註冊時 IntentFilter 設定的優先順序的順序來執行,相同優先順序的 BroadcastReceiver 則是隨機執行

5.          sendStickyBroadcast() 方法主要的不同是, Intent 在發送後一直存在,並且在以後調用 registerReceiver() 註冊相匹配的 Intent 時會把這個 Intent 直接返回。

6.          若在使用 sendBroadcast() 方法時指定了接收的許可權,這隻有在 AndroidManifest.xml 中用 <uses-permission> 標籤聲明了擁有此許可權的 BroadcastReceiver 才會有可能接收到發送來 Broadcast 。

7.          若在註冊 BroadcastReciever 時,指定了可接收的 Broadcast 的許可權,則只有在包內的 AndroidManifest.xml 中用 <uses-permission> 標籤聲明了,擁有此許可權的 Context 對象所發送的 Broadcast 才有可能被這個 BroadcastReceiver 所接收。

接收 Broadcast 訊息

1.          繼承 BroadcastReceiver 類,並實現 onReceive 方法

2.          註冊 Broadcast Receiver (有 2 種方法:一種方法是,靜態地在 AndroidManifest.xml 中用 <receiver> 標籤聲明,並在標籤內用 <intent-filter> 標籤設定過濾器; 另一種方法,動態地在代碼中先定義並設定好一個 IntentFilter 對象,然後再需要註冊的地方調用 Context.registerReceiver() 方法) (取消註冊時,調用 Context.unregisterReceiver() 方法)

 

四、Content Provider —— 為解決應用程式間資料通訊、共用的問題( 基類 ContentProvider )

       內容提供者(content provider)使一個應用程式的指定資料集提供給其他應用程式。這些資料可以儲存在檔案系統中、在一個SQLite資料庫、或以任何其他合理的方式。內容提供者繼承自ContentProvider 基類並實現了一個標準的方法集,使得其他應用程式可以檢索和儲存資料。然而,應用程式並不直接調用這些方法。相反,替代的是它們使用一個ContentResolver對象並調用它的方法。ContentResolver能與任何內容提供者通訊,它與提供者合作來管理參與進來的進程間的通訊。

       在 Android 中,每個應用程式都是用自己的使用者識別碼 並在自己的進程中運行。這樣的好處是,可以有效地保護系統及應用程式,避免被其他不正常德應用程式所影響,每個進程都擁有獨立的進程地址空間和虛擬空間。

       Content Provider 可以將應用程式特定的資料提供給另一個應用程式使用。其資料存放區方式可以是 Android 檔案系統、 SQLite 資料庫或者其他合理的方式。

       當資料需要在應用程式間共用時,我們就可以利用 ContentProvider 為資料定義一個 URI 。之後,其他應用程式對資料進行查詢或者修改時,只需要從當前內容物件獲得一個 ContentResolver, 然後傳入響應的 URI 就可以了。

       Content Provider 繼承自基類 ContentProvider ,並且實現了一組標準介面。通過這組介面,其他應用程式能對資料進行讀寫和儲存。然而,需要使用資料的應用程式並不是直接調用這組方法,而是通過調用 ContentResolver 對象的方法來完成。 ContentResolver 對象可以與任意 ContentProvider 通訊。

       要為當前應用程式的私人資料定義 URI ,就需要專門定義一個繼承自 ContentProvider 的類,然後根據不同的操作調用的方法去實現這些方法的功能。

       ContentResolver 類為應用程式提供了接入 Content 機制的方法。要構造一個 ContentResolver 對象可以為構造方法 ContentResolver(Context context) 傳入一個 Context 對象,也可以直接通過 Context 對象調用 getContentResolver() 方法獲得 —— 有的 ContentResolver 對象後,就可以通過調用其 query() 、 insert() 、 update() 等方法來對資料進行操作了。

 

一旦需要以上 4 種 Android 應用程式基底本組件完成請求, Android 會首先確認該組件所在進程是否運行,如果沒有運行, Android 將先啟動進程,同時確認被請求組件的執行個體是否存在,否則將建立一個新的組件執行個體。

 

五、Intent —— 串連組件的紐帶

       以上 4 種基本組件中,除了 Content Provider 是通過 Content Resolver 啟用外,其他 3 種組件 Activity 、 Service 和 Broadcast Receiver 都是由 Intent 非同步訊息啟用的。

       Intent 在不同的組件之間傳遞訊息,將一個組件的請求意圖傳給另一個組件。因此, Intent 是包含具體請求資訊的對象。

針對不同的組件, Intent 所包含的訊息內容有所不同,且不同組件的啟用方式也不同, 且不同類型組件有傳遞 Intent 的不同方式。

       Intent 是一種運行時綁定( runtime binding )機制,它能夠在程式啟動並執行過程中串連兩個不同的組件。通過 Intent ,你的程式可以向 Android 表到某種請求或者意願, Android 會根據意願的內容選擇適當的組件來處理請求。

l          啟用一個新的 Activity ,或者讓一個現有的 Activity 執行一個新的操作,可以通過調用如下兩種方法 ( 這兩匯總方法需要傳入的 Intent 參數稱為 Activity Action Intent) :

1.          Context.startActivity()

2.          Activity.startActivityForResult()

l          啟動一個新的服務,或者向一個已有的服務傳遞新的指令,可以調用如下兩種方法:

1.          Context.startService()

2.          Context.bindService()

l          發送廣播 Intent( 所有登入的擁有與之相匹配 IntenFilter 的 BroadcastReceiv 就會被啟用 ) ,可以調用如下三種方法:

1.          Context.sendBroadcast()

2.          Context.sendOrderBroadcast()

3.          Context.sendStickBroadcast()

Intent 一旦發出, Android 都會準確找到相匹配的一個或多個 Activity 、 Service 或 BroadcastReceiver 作響應。所以,不同類型的 Intent 訊息不會出現重疊, BroadcastIntent 訊息只會發送給 BroadcastReceiver ,而絕不可能發送給 Activity 或 Server 。有 startActivity() 傳遞的訊息也只可能發送給 Activity ,由 startService() 傳遞的 Intent 只可能發送給 Service 。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.