国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

Android中的BroadcastReceiver注冊(cè)方式研究

2015-05-29 12:07:29魯曉天李永全
電腦知識(shí)與技術(shù) 2015年10期
關(guān)鍵詞:接收器生命周期應(yīng)用程序

魯曉天+李永全

摘要:在Android整個(gè)系統(tǒng)中,Broadcast作為一種機(jī)制,在應(yīng)用程序之間傳輸信息。而BroadcastReceiver 就是對(duì)發(fā)送出來(lái)的Broadcast進(jìn)行過(guò)濾接受并響應(yīng)的一類組件,也叫作廣播接收器,是Android的四大基本組件之一。不過(guò)目前對(duì)BroadcastReceiver進(jìn)行的介紹不是很多,通過(guò)對(duì)廣播接收器的生命周期,廣播類型,注冊(cè)方式等方面進(jìn)行介紹,并通過(guò)兩個(gè)實(shí)例使讀者對(duì)廣播接收器的注冊(cè)方式有進(jìn)一步的了解,對(duì)兩種注冊(cè)方式有更直面的認(rèn)識(shí),明白動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)之間的差異和優(yōu)缺點(diǎn),對(duì)兩種基本的注冊(cè)方法的使用流程更加清晰。

關(guān)鍵詞:Android;BroadcastReceiver;注冊(cè)方式;生命周期;廣播

中圖分類號(hào):TN87 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)10-0041-02

Android系統(tǒng)共有4個(gè)基本組件,它們是Activity,Service服務(wù),Content Provider內(nèi)容提供者,BroadcastReceiver即廣播接收器。對(duì)于廣播接收器而言,雖然沒(méi)有用戶界面,但是它們可以響應(yīng)收到的信息,或者通知用戶,一般是通過(guò)啟動(dòng)一個(gè)activity來(lái)實(shí)現(xiàn)。尤其在安卓手機(jī)系統(tǒng)中,為了吸引用戶的注意力,可以有很多種方式通知用戶,比如說(shuō)讓手機(jī)震動(dòng),發(fā)聲或者亮燈。一個(gè)手機(jī)應(yīng)用可以發(fā)出通知對(duì)外部事件進(jìn)行過(guò)濾和接收并做出響應(yīng)。一般來(lái)說(shuō),用戶獲得消息,可以通過(guò)很多方式,比如點(diǎn)擊在狀態(tài)欄上顯示的圖標(biāo)。對(duì)于整個(gè)Android系統(tǒng),廣播無(wú)處不在,在開機(jī)過(guò)程中,系統(tǒng)就會(huì)產(chǎn)生一條廣播,如果能夠接收到這條廣播,手機(jī)就能進(jìn)行開機(jī)啟動(dòng)服務(wù)。

1 BroadcastReceiver生命周期

一個(gè)廣播接收器對(duì)象的生命周期往往都是從被調(diào)用的一刻開始直到調(diào)用結(jié)束。對(duì)象的調(diào)用方式一般是通過(guò)onReceive()函數(shù)來(lái)實(shí)現(xiàn)的,如果該函數(shù)返回值后,此次對(duì)象就變成無(wú)效的了,這就是一個(gè)完整的生命周期。

在函數(shù)調(diào)用的整個(gè)過(guò)程中,一般不允許有很費(fèi)時(shí)的操作,并且不能使用線程來(lái)執(zhí)行。這是因?yàn)榧僭O(shè)同時(shí)有其他異步操作返回了結(jié)果時(shí),這時(shí)廣播接收器也許已經(jīng)失效。它的生命周期一般在十秒左右,要是onReceive()里面做大于十秒的事情,就會(huì)產(chǎn)生錯(cuò)誤。當(dāng)廣播到來(lái)的時(shí)候,會(huì)對(duì)廣播接收器對(duì)象重新創(chuàng)建,通過(guò)onReceive()函數(shù),執(zhí)行完以后,這時(shí)候?qū)ο缶蜁?huì)被去掉。

2 BroadcastReceiver注冊(cè)方式

廣播接收器的注冊(cè)方式有兩種,即靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)。對(duì)于靜態(tài)注冊(cè)方式的配置是在AndroidManifest.xml這樣一個(gè)文件中進(jìn)行的,我們首先要做的就是要在MyReceiver進(jìn)行一個(gè)廣播地址的注冊(cè)。在地址信息配置好以后,MyReceiver就應(yīng)該可以接收到信息。因此靜態(tài)注冊(cè)是常駐型的,當(dāng)應(yīng)用程序關(guān)閉或者停止后,如果還是有廣播消息產(chǎn)生進(jìn)來(lái),MyReceiver同樣會(huì)被系統(tǒng)調(diào)用并且會(huì)自動(dòng)的運(yùn)行。由此可以知道這種注冊(cè)方式的特點(diǎn):無(wú)論應(yīng)用程序是否處于活動(dòng)狀態(tài),都會(huì)對(duì)其進(jìn)行監(jiān)聽,在手機(jī)上安裝好后,不管該應(yīng)用程序是處于什么狀態(tài),都會(huì)執(zhí)行該監(jiān)聽方法中的內(nèi)容。

動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)不同,它必須指定在代碼中動(dòng)態(tài)的廣播地址進(jìn)行注冊(cè),一般我們會(huì)在Activity中注冊(cè)一個(gè)廣播。因此這種注冊(cè)方式不是常駐型的,如果程序的生命周期結(jié)束,廣播也會(huì)跟著結(jié)束。此外動(dòng)態(tài)注冊(cè)廣播接收器的廣播會(huì)跟著Activity的狀態(tài),如果注冊(cè)的Activity被關(guān)閉之后,廣播也會(huì)隨著失效。相反靜態(tài)注冊(cè)就不用考慮廣播接收器是否被關(guān)閉,只要手機(jī)設(shè)備處于開啟狀態(tài),并且廣播接收器也是開啟狀態(tài)。無(wú)論用哪種方式在哪個(gè)里面注冊(cè),都要用到sendBroadcast()發(fā)送廣播。用廣播發(fā)送的是一個(gè)Intent,而Intent里面則是一個(gè)action。采用動(dòng)態(tài)注冊(cè)在代碼里面進(jìn)行,注冊(cè)一般用到onResume()。如果是靜態(tài)方式,在xml文件中注冊(cè)也是可行的。

3廣播的收發(fā)

顧名思義,廣播的收發(fā)就兩個(gè)過(guò)程,接收和發(fā)送。在發(fā)送過(guò)程中,第一步廣播在需要發(fā)送信息的位置,將需要發(fā)送的和過(guò)濾的信息放進(jìn)一個(gè)Intent對(duì)象中,第二步就是調(diào)用Context.sendBroadcast()函數(shù)的方法,來(lái)把Intent對(duì)象通過(guò)廣播發(fā)送出去。Intent對(duì)象發(fā)出去之后,只要是滿足條件的廣播接收器都會(huì)隨機(jī)地執(zhí)行onReceive()函數(shù)。一般而言廣播都是系統(tǒng)自身發(fā)起的,比如來(lái)電來(lái)信、信號(hào)的異常、地域的變換、電量報(bào)警等。當(dāng)然程序也可以自身播放一個(gè)廣播。并且程序用于響應(yīng)重要通知的BroadcastReceivers,它的數(shù)量是不固定的。這樣廣播通過(guò)多種方式通知用戶,比如振動(dòng)設(shè)備、開啟閃光燈、播放音效等。為了方便直觀,大都采用在狀態(tài)欄產(chǎn)生一個(gè)特定的圖標(biāo),使用者就可以點(diǎn)開它來(lái)查看通知的具體內(nèi)容。如果一個(gè)廣播消息被監(jiān)聽到時(shí),Android就會(huì)調(diào)用它,并且將包含此消息的Intent對(duì)象傳給它。在onReceive中執(zhí)行代碼的時(shí)間最好不要超過(guò)5秒。Receiver只在onReceive被執(zhí)行的時(shí)候是激活狀態(tài),一旦返回,Receiver就不再是激活狀態(tài)了。

4 BroadcastReceiver示例演示

在Android系統(tǒng)中廣播的樣式各種各樣,例如電池電量的狀態(tài),短信接收發(fā)送和電話的接收狀態(tài)都會(huì)產(chǎn)生一個(gè)廣播,應(yīng)用程序的開發(fā)就是對(duì)這些廣播狀態(tài)進(jìn)行監(jiān)聽,而且還對(duì)程序邏輯做出相應(yīng)的處理。為了使讀者能更好理解廣播接收器注冊(cè)方式 ,作者通過(guò)兩個(gè)簡(jiǎn)單的例子進(jìn)行說(shuō)明。這兩個(gè)例子很簡(jiǎn)單,一個(gè)是接收短信,利用的是靜態(tài)注冊(cè)的廣播(常駐廣播)。另一個(gè)是電量監(jiān)控,利用的是動(dòng)態(tài)注冊(cè)廣播。

4.1接收短信

接收短信在AndroidManifest.xml里面的application來(lái)定義receiver并設(shè)置成接收狀態(tài)的。當(dāng)需要發(fā)送能夠跨線程、跨進(jìn)程的廣播時(shí),就可以使用廣播接收器了。它接受的對(duì)象是Intent,對(duì)象可以攜帶Action,也可以攜帶數(shù)據(jù)等。每一個(gè)廣播接收器都需要建立一個(gè)Intent-filter,不然就無(wú)法過(guò)濾不想收到的對(duì)象。而當(dāng)某個(gè)線程想發(fā)一個(gè)廣播給某個(gè)廣播接收器時(shí),發(fā)送的Action必須符合該廣播接收器的Intent-filter的Action,不然無(wú)法接收。

系統(tǒng)注冊(cè)在AndroidManifest.xml中的程序如下:

< receiver android:name = ".MyBroadcastReceiver" >

< intent-filter android:priority = "1000" >

< action android:name = " android.provider.Telephony.SMS_RECEIVED" />

需要權(quán)限 :

< uses-permission android:name = "android.permission.RECEIVE_SMS" />

< uses-permission android:name = "android.permission.SEND_SMS" />

部分實(shí)現(xiàn)功能程序如下:

System.out.println("短信接收器監(jiān)聽: " + intent.getAction());

...

phoneNum = currentMessage.getDisplayOriginatingAddress();// 來(lái)訊者的電話號(hào)碼

SMScontent = currentMessage.getDisplayMessageBody(); // 短信內(nèi)容

}

Toast.makeText(arg0, "接收到(" + phoneNum + ")的短信:+\n" + SMScontent, Toast.LENGTH_SHORT).show();

4.2電量監(jiān)控

一般而言,當(dāng)我們想查看電池使用狀態(tài)時(shí),都是查看當(dāng)前的電量,而不是觀察電量變化的廣播,這樣為了立即顯示出當(dāng)前電池電量。我們可以按以下方式實(shí)現(xiàn):

在以上程序中可以看到有兩個(gè)參數(shù),第一個(gè)參數(shù)為廣播接收者。它可以是系統(tǒng)自身的,也可以是通過(guò)定義的;另一個(gè)參數(shù)為意圖過(guò)濾器。我們?cè)趧?chuàng)建完廣播接收器之后,需要先為它注冊(cè)一個(gè)指定的廣播地址,才能使它進(jìn)入工作狀態(tài)。

在代碼中注冊(cè)程序,利用IntentFilter對(duì)象來(lái)過(guò)濾掉那些無(wú)法響應(yīng)和處理的Intent對(duì)象,這樣可以只將自己需要的Intent對(duì)象接收進(jìn)來(lái)進(jìn)行處理。IntentFilter只列出組件愿意接受的對(duì)象,但它只會(huì)對(duì)隱式對(duì)象進(jìn)行過(guò)濾,而顯式對(duì)象會(huì)直接被傳送到目標(biāo)組件中去。在Android組件中,IntentFilter的數(shù)量不受限制,可以允許有多個(gè)同時(shí)存在,它們之間是相互獨(dú)立,只要有一個(gè)驗(yàn)證通過(guò),就全部可以工作。程序如下:

4.3 總結(jié)歸納

本文通過(guò)兩個(gè)簡(jiǎn)單的示例使讀者能夠加深了解廣播接收器的注冊(cè)方式。從中可以發(fā)現(xiàn):動(dòng)態(tài)注冊(cè)較靜態(tài)注冊(cè)靈活。采用靜態(tài)注冊(cè)一個(gè)廣播接收器時(shí),對(duì)應(yīng)的廣播的接收不受應(yīng)用程序狀態(tài)的影響。如果是采用動(dòng)態(tài)注冊(cè),必須用到unregisterReceiver()這樣一個(gè)函數(shù)來(lái)取消注冊(cè),否則跟靜態(tài)注冊(cè)的模式就是一樣的。但是執(zhí)行了該函數(shù)之后,就不允許再接受廣播。對(duì)于有序廣播消息,動(dòng)態(tài)注冊(cè)的廣播接收器總是先于靜態(tài)注冊(cè)的廣播接收器被觸發(fā)。對(duì)于同樣是動(dòng)態(tài)注冊(cè)的廣播接收器,優(yōu)先級(jí)別高的將先被觸發(fā),而靜態(tài)注冊(cè)的廣播接收器總是按照靜態(tài)注冊(cè)的順序執(zhí)行。由此在注冊(cè)方法的選擇上,還是推薦使用靜態(tài)注冊(cè)方式,通過(guò)系統(tǒng)來(lái)管理receiver,并且程序所有的receiver,都可以在xml里面看到。相反動(dòng)態(tài)注冊(cè)方式,receiver隱藏在代碼中,難以查找發(fā)現(xiàn),不便于程序的調(diào)試。

參考文獻(xiàn):

[1] 曾健平. 邵艷潔. Android系統(tǒng)架構(gòu)及應(yīng)用程序開發(fā)研究[J]. 微計(jì)算機(jī)信息, 2011(9): 1-3.

[2] 關(guān)晶鑫, 李永全. 基于Android的手機(jī)購(gòu)物終端系統(tǒng)設(shè)計(jì)[J]. 電子世界, 2013(2): 2713-2717.

[3] 胡偉. Android系統(tǒng)架構(gòu)及其驅(qū)動(dòng)研究[J]. 廣州廣播電視大學(xué)學(xué)報(bào), 2010(4): 96-101.

[4] 李寧, 朱清昃, 王冬霞.安卓系統(tǒng)手機(jī)通訊錄的設(shè)計(jì)與實(shí)現(xiàn)[J].遼寧工業(yè)大學(xué)學(xué)報(bào), 2014(4): 212-215.

[5] 楊瀟亮. 基于安卓操作系統(tǒng)的應(yīng)用軟件開發(fā)[J]. 電子制作, 2014(19): 45-46.

猜你喜歡
接收器生命周期應(yīng)用程序
動(dòng)物的生命周期
全生命周期下呼吸機(jī)質(zhì)量控制
基于PLC技術(shù)的船舶信號(hào)接收器設(shè)計(jì)
從生命周期視角看并購(gòu)保險(xiǎn)
刪除Win10中自帶的應(yīng)用程序
民用飛機(jī)全生命周期KPI的研究與應(yīng)用
JXG-50S型相敏軌道電路接收器自動(dòng)測(cè)試臺(tái)
埃及
IDT推出超緊湊型無(wú)線電源接收器,可節(jié)省70%板面積
關(guān)閉應(yīng)用程序更新提醒
電腦迷(2012年15期)2012-04-29 17:09:47
黄大仙区| 明溪县| 铁岭县| 南郑县| 赤城县| 承德县| 邵东县| 临武县| 鄂托克前旗| 永和县| 湖北省| 昌都县| 兰溪市| 自治县| 高尔夫| 武夷山市| 宝兴县| 沙洋县| 洪雅县| 延津县| 龙州县| 宁安市| 清镇市| 万荣县| 阳原县| 汕尾市| 长乐市| 新宾| 麻栗坡县| 平潭县| 祁阳县| 塔城市| 宁津县| 墨脱县| 龙游县| 盐源县| 柏乡县| 上高县| 红安县| 明溪县| 岳普湖县|