Android四大組件的區(qū)別與聯(lián)系

   Android 開(kāi)發(fā)的四大組件分別是:
   活動(dòng)(activity),用于表現(xiàn)功能;
   服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);
   廣播接受者(Broadcast Receive),用于接收廣播;
   內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù)。
   其中,除了Activity是以界面的形式呈現(xiàn)的,其他三大組件對(duì)于用戶都是透明的。

   Activity是一種展示型組件,具有兩種啟動(dòng)方式,一種是顯示的,通過(guò)intent實(shí)現(xiàn);另一種是隱式的,也需要intent,但還需要在AndroidManifest.xml中添加intentfilter。在實(shí)現(xiàn)Activity時(shí),需要繼承Activity抽象類,并且重寫onCreat()方法,因此,Activity具有啟動(dòng)和停止的概念。

   Service是一種計(jì)算型組件,其生命是嵌套在主線程中的。Service有兩種狀態(tài):?jiǎn)?dòng)狀態(tài)和綁定狀態(tài),并且只能顯示啟動(dòng),因此在AndroidManifest.xml中注冊(cè)Service時(shí),只需要注冊(cè)服務(wù)的類名即可。啟動(dòng)狀態(tài)和綁定狀態(tài)的區(qū)別在于:?jiǎn)?dòng)之后,Service的動(dòng)作不受Activity的控制;而綁定之后,Service的動(dòng)作是由Activity控制的。在實(shí)現(xiàn)Service時(shí),需要繼承Service抽象類,并且重寫onCreat()方法,因此,Service也具有啟動(dòng)和停止的概念。

  BroadcastReceiver是一種消息型組件。由于BroadcastReceiver可以在不同的組件甚至不同的應(yīng)用之間傳遞消息,所以其可以脫離Activity實(shí)現(xiàn),除了要在AndroidManifest.xml中注冊(cè)廣播類名外,還需要添加intentfilter,這樣就可以讓receiver選擇性的接收廣播。當(dāng)注冊(cè)完成之后,即使沒(méi)有Activity啟動(dòng),也可以接收廣播。在實(shí)現(xiàn) BroadcastReceiver時(shí),需要繼承 BroadcastReceiver抽象類,但是不需要重寫onCreat()方法,只需重寫onReceive()方法,因此,Service沒(méi)有啟動(dòng)和停止的概念,更像是一個(gè)系統(tǒng)級(jí)的監(jiān)聽(tīng)器。

   ContentProvider是一種數(shù)據(jù)共享型組件,可以在應(yīng)用之間共享數(shù)據(jù)。所以與BroadcastReceiver一樣,其可以脫離Activity實(shí)現(xiàn)。在實(shí)現(xiàn)ContentProvider時(shí),需要繼承ContentProvider抽象類,然后在AndroidManifest.xml中注冊(cè)類名和ContentProvider的域名。同樣的,不需要重寫onCreat()方法,而是實(shí)現(xiàn)CRUD操作,所以ContentProvider沒(méi)有啟動(dòng)和停止的概念,更像是一個(gè)系統(tǒng)級(jí)的監(jiān)聽(tīng)器。與前三個(gè)組件不同的是,ContentProvider并沒(méi)有使用intent,而是使用URI來(lái)判定能否為ContentResolver提供數(shù)據(jù)共享。

總結(jié):

1.Activity與Service有生命周期,而B(niǎo)roadcastReceiver與ContentProvider采用監(jiān)聽(tīng)機(jī)制,沒(méi)有生命周期。

  1. 四大組件都需要在AndroidManifest.xml中注冊(cè)。

3.除了ContentProvider外,其他組件都要用到intent。

  1. 四大組件實(shí)現(xiàn)時(shí)都要繼承其抽象的父類。

  2. Service與Activity關(guān)系最為密切,BroadcastReceiver與ContentProvider的實(shí)現(xiàn)基本不依賴于Activity。

以上,摘自:https://blog.csdn.net/ding_ding_123/article/details/51211740

再往下看,就是

更具體的——

1.活動(dòng)

Android中,activity是所有程序的根本,所有程序的流程都運(yùn)行在activity之中,activity可以算是開(kāi)發(fā)者遇到的最頻繁,也是android當(dāng)中最基本的模塊之一。在android的程序中,activity一般代表手機(jī)屏幕的一屏。如果把手機(jī)比作一個(gè)瀏覽器,那么activity就相當(dāng)于一個(gè)網(wǎng)頁(yè)。在activity當(dāng)中可以添加一些Button、Checkbox等控件,可以看到activity概念和網(wǎng)頁(yè)的概念相當(dāng)類似。

一般一個(gè)android應(yīng)用是由多個(gè)activity組成的,這多個(gè)activity之間可以進(jìn)行相互跳轉(zhuǎn)。例如,按下一個(gè)Button按鈕后,可能會(huì)跳轉(zhuǎn)到其他的activity,與網(wǎng)頁(yè)跳轉(zhuǎn)稍微有點(diǎn)不一樣的是,activity之間的跳轉(zhuǎn)有可能返回值。例如,從activity A跳轉(zhuǎn)到activity B,那么當(dāng)activity B運(yùn)行結(jié)束時(shí),有可能會(huì)給activity A一個(gè)返回值。這樣做在很多時(shí)候是相當(dāng)方便的。

當(dāng)打開(kāi)一個(gè)新的屏幕時(shí),之前一個(gè)屏幕會(huì)被置為暫停狀態(tài),并且壓入歷史堆棧中。用戶可以通過(guò)回退操作返回到以前打開(kāi)過(guò)的屏幕??梢赃x擇性的一處一些沒(méi)有必要保留的屏幕,因?yàn)锳ndroid會(huì)把每個(gè)應(yīng)用的開(kāi)始到當(dāng)前的每個(gè)屏幕保存在堆棧中。

2.服務(wù)

Service是android系統(tǒng)中的一種組件,跟activity的級(jí)別差不多,但是他不能自己運(yùn)行,只能后臺(tái)運(yùn)行,并且可以和其他組件進(jìn)行交互。Service是沒(méi)有界面長(zhǎng)生命周期的代碼。Service是一種程序,可以運(yùn)行很長(zhǎng)時(shí)間的,但是卻沒(méi)有用戶界面。這么說(shuō)有點(diǎn)枯燥,來(lái)看個(gè)例子。打開(kāi)一個(gè)音樂(lè)播放器的程序,這時(shí)如果想上網(wǎng),那么打開(kāi)Android瀏覽器,這時(shí)雖然已經(jīng)進(jìn)入瀏覽器這個(gè)程序,但是歌曲播放并沒(méi)有停止,而是在后臺(tái)繼續(xù)一首接一首的播放,其實(shí)這個(gè)播放就是由播放音樂(lè)的Service進(jìn)行控制。當(dāng)然這個(gè)播放音樂(lè)的Service也可以停止。例如,當(dāng)播放列表里的歌曲都結(jié)束,或用戶按下了停止音樂(lè)播放的快捷鍵等。Service可以在很多場(chǎng)合的應(yīng)用中使用,如播放多媒體時(shí)用戶啟動(dòng)了其他Activity,這時(shí)程序要在后臺(tái)繼續(xù)播放,比如檢測(cè)SD卡上文件的變化,或在后臺(tái)記錄地理信息位置的改變等,而服務(wù)卻藏在后臺(tái)。

開(kāi)啟Service有兩種方式:

(1)Context.starService():Service會(huì)經(jīng)歷onCreat ——>onStar(如果Service還沒(méi)有運(yùn)行,則Android先調(diào)用onCreat(),然后調(diào)用onStar(),所以一個(gè)Service的onStar方能會(huì)重復(fù)調(diào)用多次);如果是調(diào)用者自己直接退出而沒(méi)有調(diào)用StopService,服務(wù)會(huì)一直在后臺(tái)運(yùn)行。該服務(wù)的調(diào)用者再啟動(dòng)起來(lái)后可以通過(guò)stopService關(guān)閉服務(wù)。注意,多次調(diào)用Context.starService()不會(huì)被嵌套(即使會(huì)有相應(yīng)的onStar()方法被調(diào)用),所以無(wú)論同一個(gè)服務(wù)被啟動(dòng)多少次,一旦調(diào)用Context.stopService()或者StopSelf(),都會(huì)被停止。

說(shuō)明:傳遞給starService()的Intent對(duì)象會(huì)傳遞給onStar()方法。調(diào)用順序?yàn)閛nCreat——onStar(可調(diào)用多次)——onDestroy.

(2)Context.bindService():服務(wù)會(huì)經(jīng)歷onCreate()——onBind(),onBind將返回給客戶端一個(gè)IBind接口實(shí)例,IBind允許客戶端回調(diào)服務(wù)的方法,比如得到服務(wù)運(yùn)行的狀態(tài)或其他操作。這個(gè)時(shí)候把調(diào)用者(Context,如Activity)會(huì)和服務(wù)綁定在一起,Context退出了,服務(wù)就會(huì)調(diào)用onUnbind——onDestroy相應(yīng)退出,所謂綁定在一起就是“共存亡”了。

3.廣播接收器

在Android中,廣播是一種廣泛運(yùn)用的在應(yīng)用程序之間傳輸信息的機(jī)制。而廣播接收器是對(duì)發(fā)送出來(lái)的廣播進(jìn)行過(guò)濾接受并響應(yīng)的一類組件??梢允褂脧V播接收器來(lái)讓應(yīng)用對(duì)一個(gè)外部時(shí)間做出響應(yīng)。例如,當(dāng)電話呼入這個(gè)外部事件到來(lái)時(shí),可以利用廣播接收器進(jìn)行處理。當(dāng)下載一個(gè)程序成功完成時(shí),仍然可以利用廣播接收器進(jìn)行處理。廣播接收器不NotificationManager來(lái)通知用戶這些事情發(fā)生了。廣播接收器既可以在AndroidManifest.xml中注冊(cè),也可以在運(yùn)行時(shí)的代碼中使用Context.registerReceive()進(jìn)行注冊(cè)。只要是注冊(cè)了,當(dāng)事件來(lái)臨時(shí),即使程序沒(méi)有啟動(dòng),系統(tǒng)也在需要的時(shí)候啟動(dòng)程序。各種應(yīng)用還可以通過(guò)使用Context.sendBroadcast()將它們自己的Intent廣播給其他應(yīng)用程序。

4.內(nèi)容提供者

內(nèi)容提供者(Content Provider)是Android提供的第三方應(yīng)用數(shù)據(jù)的訪問(wèn)方案。

在Android中,對(duì)數(shù)據(jù)的保護(hù)是很嚴(yán)密的,除了放在SD卡中的數(shù)據(jù),一個(gè)應(yīng)用所持有的數(shù)據(jù)庫(kù)、文件等內(nèi)容,都是不允許其他直接訪問(wèn)的。Android當(dāng)然不會(huì)真的把每一個(gè)應(yīng)用都做成一座“孤島”,它為所有應(yīng)用都準(zhǔn)備可一扇窗,這就是Content Provider。應(yīng)用想對(duì)外提供的數(shù)據(jù),可以通過(guò)派生Content Provider類,封裝成一枚Content Provider。每個(gè)Content Provider都用一個(gè)uri作為獨(dú)立的標(biāo)識(shí),形如:content://com.xxxxx。所有應(yīng)用看著像REST的樣子,但實(shí)際上它比REST更為靈活。和REST類似,uri也可以有兩種類型,一種是帶id的;另一種是列表的,但實(shí)現(xiàn)者不需要按照這個(gè)模式來(lái)做,給id的uri也可以返回列表類型的數(shù)據(jù)。

作者:shiretan
來(lái)源:CSDN
原文:https://blog.csdn.net/shiretan/article/details/55053857
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容