Android應用層五大組件介紹及使用打賞

5 Basic Components

  1. Activity
  2. Service
  3. Broadcast Receiver
  4. Content Provider
  5. Intent

Activity——應用表示層(基類Activity)

應用程序中的每個屏幕都是通過繼承和擴展基類Activity來實現的。

同一應用中的每個Activity是相互獨立的。程序啟動后顯示的第一幅畫面是應用程序的第一個Activity(默認窗口),而后可以根據需要從這個Activity啟動另一個新的Activity。

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

  1. 每個View對象控制著窗口內的一個矩形空間;
  2. View是一種層次化結構,Parent View中的布局屬性會被子View繼承;
  3. 位于View層次關系最底層的子View對象所代表的矩形空間就是跟用戶進行交互的地方。

Activity狀態回調:

  1. onCreate
  2. onStart
  3. onRestart
  4. onResume
  5. onPause
  6. onStop
  7. onDestroy

Service——沒有可見的用戶界面,但能夠長時間運行于后臺(基類Service)

運行于應用程序進程的主線程中,因此Service不會阻塞其他組件和用戶界面。

Service是不能自己啟動的,必須通過Context對象(如一個Activity)調用startService或bindService方法來啟動(用這兩種方法啟動的Service的生命周期不同)。
調用startService方法
a)若Service沒有啟動,則首先會調用該Service的onCreate方法,然后再調用onStart方法。
b)若Service已經啟動,則會直接調用onStart方法
c)該方法啟動的Service,可以通過Context對象調用stopService來關閉,也可以通過Service自身調用stopSelf()或stopSelfResult()來關閉,關閉之前調用onDestory方法。
調用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狀態回調:

  1. onCreate
  2. onStart
  3. onBind
  4. onRebind
  5. onUnbind
  6. onDestroy

Broadcast Receiver——用戶接收廣播通知的組件(基類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)
在Android中,每個應用程序都是用自己的用戶ID并在自己的進程中運行。這樣的好處是,可以有效地保護系統及應用程序,避免被其他不正常德應用程序所影響,每個進程都擁有獨立的進程地址空間和虛擬空間。
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會根據意愿的內容選擇適當的組件來處理請求。

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

  1. Context.startActivity()
  2. Activity.startActivityForResult()

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

  1. Context.startService()
  2. Context.bindService()

發送廣播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。

Intent對象抽象地描述了執行操作,Intent的主要組成部分;
1、目標組件名稱。[可選項]
a)組件名稱是一個ComponentName對象,是目標組件類名和目標組件所在應用程序包的組合
b)組件中的包名不一定要和manifes文件中包名完全匹配
c)如果Intent消息中指明了目標組件的名稱,這就是一個顯示消息,Intent會傳遞給指明的組件。
d)如果目標組件名稱并沒有指定,Android則通過Intent內的其他信息和已注冊的IntentFilter的比較來選擇合適的目標組件
2、Action [隱式比較]
a)描述Intent所觸發動作的名字字符串。
b)理論上Action可以為任何字符串,而與Android系統應用有關的Action字符串以靜態字符串常量的形式定義在了Intent類中。
3、Data [隱式比較]
a)描述Intent要操作的的數據的URI和數據類型。
b)正確設置Intent的數據對于Android尋找系統中匹配Intent請求的組件很重要。
4、Category [隱式比較]
a)是對被請求組件的額外描述信息。
b)Android也在Intent類中定義了一組靜態字符串常量表示Intent不同的類別。
5、Extra
a)當我們使用Intent連接不同組件時,有時需要在Intent中附加額外的信息,以便將數據傳遞給目標Activity。
b)Extra用鍵值對結構保存在Intent對象當中,Intent對象通過調用方法putExtras() 和 getExtras()來存儲和獲取Extra
c)Extra是以Bundle對象的形式來保存的,Bundle對象提供了一系列put和get方法來設置、提取相應鍵值信息。
d)在Intent類中同樣為Android系統應用的一些Extra的鍵值定義了靜態字符串常量。
6、Flag

決定Intent目標組件的因素:
在顯式Intent消息中,決定目標組件的唯一要素就是組件名稱(不用再定義其他Intent內容)
而隱式Intent消息中,由于沒有目標組件名稱,所以必須由Android系統幫助應用程序尋找與Intent請求意圖最匹配的組件。
隱式Intent消息中目標組件具體選擇方法是:android將Intent的請求內容和一個叫做IntentFilter的過濾器比較,IntentFilter中包含系統中所有可能的待選組件。如果IntentFilter中某一個組件匹配隱式Intent請求內容,那么Android就選擇該組件作為該隱式Intent的目標組件。
IntenFilter

應用程序的組件為了告訴Android自己能響應、處理哪些隱式Intent請求,可以聲明一個甚至多個IntentFilter。
每個IntentFilter描述該組件所能響應Intent請求的能力 —— 組件希望接收什么類型的請求行為,什么類型的請求數據。
隱式Intent和IntentFilter進行比較時的三要素:Action、Data、Category。

一個隱式Intent請求要能夠傳遞給目標組件,必需通過以上三個方面的檢查。如果任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。
<intent-filter>
<action android:name=””/>
<category android:name=””/>
<data android:type=”” android:scheme=”” android:authority=”” android:path=””/>
</intent-filter>
1、動作測試
a)一條 <intent-filter> 中至少應該包含一個<action>, 否則任何Intent請求都不能和該<intent-filter> 匹配。
b)如果IntentFilter 中沒有包含任何Actino類型,那么無論什么Intent請求都無法和這條IntentFilter匹配。
c)如果Intent請求中沒有設定Action類型,那么只要IntentFilter中包含有Action類型,這個Intent請求將順利通過IntentFilter的測試。
2、類別測試
a)只有當Intent請求中所有的Category與組件中的某一個IntentFilter的category完全匹配,才會讓該Intent請求通過測試,IntentFilter中的多余category聲明并不會導致匹配失敗。
b)一個沒有指定任何類別的IntentFilter僅僅只會匹配沒有設置類別的Intent請求。
3、數據測試
a)<data>元素指定了希望接受的Intent請求的數據URI和數據類型:URI被分成三部分類進行匹配,scheme、authority和 path.
b)使用 setData設定的Intent請求的URI數據類型和scheme,必須與IntentFilter中指定的一致

若IntentFilter中還指定了authority或path,他們也需要相匹配才會通過測試。

Android應用層五大組件介紹及使用
文章《Android應用層五大組件介紹及使用》二維碼
  • 微信打賞
  • 支付寶打賞

已有9條評論

  1. 若柳

    幫頂幫頂幫頂

    2015-12-20 21:59 回復
  2. 游客 660

    沒有白看,還是有收獲的,好!

    2012-05-25 17:06 回復
  3. 不亦樂乎

    最新博客后面加個news是怎么實現的?

    2012-05-25 11:38 回復
    • 窮小子

      用代碼啊控制輸出一個new啊。判斷發表時間是否大于自己設定的值。比如我的就是24小時 3600*24

      2012-05-25 20:50 回復
      • 不亦樂乎

        我以為像置頂文章一樣wp自帶有這功能。我php很差的,雖然想的到不過做不來。

        2012-05-26 14:02 回復
        • 窮小子

          我這個主題置頂沒有置頂的提示。就是在添加置頂標示的時候想起來判斷下時間了。

          2012-05-26 19:55 回復
  4. 石家莊婚紗攝影

    對這個不太懂啊,學習一下了

    2012-05-25 09:08 回復

(必填)

(必填)

(可選)

黑龙江22选5开奖