亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Android中的BroadcastReceiver注冊方式研究

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

        魯曉天+李永全

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

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

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

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

        1 BroadcastReceiver生命周期

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

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

        2 BroadcastReceiver注冊方式

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

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

        3廣播的收發(fā)

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

        4 BroadcastReceiver示例演示

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

        4.1接收短信

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

        系統(tǒng)注冊在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();// 來訊者的電話號碼

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

        }

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

        4.2電量監(jiān)控

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

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

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

        4.3 總結(jié)歸納

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

        參考文獻(xiàn):

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

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

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

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

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

        猜你喜歡
        接收器生命周期應(yīng)用程序
        動物的生命周期
        全生命周期下呼吸機(jī)質(zhì)量控制
        基于PLC技術(shù)的船舶信號接收器設(shè)計
        從生命周期視角看并購保險
        中國外匯(2019年13期)2019-10-10 03:37:46
        刪除Win10中自帶的應(yīng)用程序
        電腦報(2019年12期)2019-09-10 05:08:20
        民用飛機(jī)全生命周期KPI的研究與應(yīng)用
        JXG-50S型相敏軌道電路接收器自動測試臺
        埃及
        IDT推出超緊湊型無線電源接收器,可節(jié)省70%板面積
        關(guān)閉應(yīng)用程序更新提醒
        電腦迷(2012年15期)2012-04-29 17:09:47
        日韩av中出在线免费播放网站 | av资源吧首页在线观看| 国产成人大片在线播放| 亚洲第一最快av网站| 大胆欧美熟妇xxbbwwbw高潮了| 亚洲中文无码精品久久不卡| 日本免费一区二区久久久| 亚洲三区在线观看内射后入| 久久99精品国产99久久6尤物| 国产精品国产三级在线高清观看 | 亚洲一区二区日韩精品在线| 久久久久久久综合综合狠狠| 狠狠躁夜夜躁人人爽超碰97香蕉| 一区视频在线观看免费播放.| 日本成年一区久久综合| 国产农村熟妇videos| 一区二区国产在线观看| 女同国产日韩精品在线| 国产精品久久久三级18| 一本色综合久久| 成 人 网 站 在线 看 免费| 亚洲精品中文字幕一二三| 国产果冻豆传媒麻婆精东| 人妻av一区二区三区精品| 日本一区二区三区在线播放| 日韩一区av二区三区| 人妻激情另类乱人伦人妻| 精品一精品国产一级毛片| 在线高清亚洲精品二区| 国产熟妇疯狂4p交在线播放| 无码人妻精品一区二区三18禁 | 男男互吃大丁视频网站| 青青草骚视频在线观看| 水蜜桃无码视频在线观看| 久久熟女五十路| 久久精品一区二区熟女| 夜夜添夜夜添夜夜摸夜夜摸 | 国产亚洲精品90在线视频| 熟女无套内射线观56| 亚洲欧洲日韩免费无码h| 蜜桃成熟时日本一区二区|