最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

第六章 組件通訊與廣播消息(廣播與廣播接收器 )

2018-11-08 23:42 作者:swiss126  | 我要投稿

參考資料:

《Android應(yīng)用程序開發(fā)》ISBN 9787302283164

參考軟件:

Android Studio、Eclipse+ADT、Android SDK、JDK

broadcast reciver簡介

很多時候,我們希望一個應(yīng)用程序在它沒有運行起來的時候,也能感知系統(tǒng)狀態(tài)的某些變化,如果條件合適,就讓這個應(yīng)用運行起來。

比如,一個攔截騷擾電話的應(yīng)用,平時它可能并不需要運行起來,它只關(guān)心有電話來的時候,看看這個號碼是不是騷擾電話的號碼,如果是就給用戶發(fā)出一個提示,如果不是,那就和它沒有關(guān)系,啥也不做。

為了實現(xiàn)這類功能,安卓系統(tǒng)引入了四大組件之一的BroadcastReceiver,設(shè)計了一套廣播與接收的機(jī)制,

  1. 任何應(yīng)用或者安卓系統(tǒng)的自身組件可以像發(fā)送無線電波一樣,向系統(tǒng)發(fā)出一條廣播信息Broadcast;

  2. 信息在系統(tǒng)中按照一定的規(guī)則傳播;

  3. 任何應(yīng)用或者安卓系統(tǒng)的自身組件都可擁有一臺接收機(jī)-Broadcast Receiver,這臺接收機(jī)會告訴安卓系統(tǒng),它能接收某種特定的廣播;

  4. 如果安卓系統(tǒng)辨別出當(dāng)前系統(tǒng)中傳播的廣播,正是某臺接收機(jī)關(guān)注的廣播,那么它就會把接收機(jī)運行起來,讓接收機(jī)決定下一步怎么做:是運行別的組件(Service或者Activity)繼續(xù)進(jìn)一步的響應(yīng),或者是忽略這條廣播。

?broadcast概念

BroadcastReceiver,顧名思義就是“廣播接收者”的意思,它是Android四大基本組件之一,這種組件本質(zhì)上是一種全局的監(jiān)聽器,用于監(jiān)聽系統(tǒng)全局的廣播消息。它可以接收來自系統(tǒng)和應(yīng)用的的廣播。由于BroadcastReceiver是一種全局的監(jiān)聽器,因此它可以非常方便地實現(xiàn)系統(tǒng)不同組件之間的通信。比如Activity與通過startService()方法啟動的Service之間通信,就可以借助于BroadcastReceiver來實現(xiàn)。

實現(xiàn)原理

  • Android中的廣播使用了設(shè)計模式中的觀察者模式:基于消息的發(fā)布/訂閱事件模型。

  • 因此,Android將廣播的發(fā)送者和接收者極大程度解耦,使得系統(tǒng)能夠方便集成,更易擴(kuò)展。

具體實現(xiàn)流程概括如下:

  1. 自定義廣播接收者BroadcastReceiver,并復(fù)寫onRecvice()方法;

  2. 通過Binder機(jī)制向AMS(Activity Manager Service)進(jìn)行注冊;

  3. 廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播;

  4. AMS查找符合相應(yīng)條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊列中;

  5. 消息循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcastReceiver中的onReceive()方法。

從上面可以看出:

  • 廣播發(fā)送者和廣播接收者分別屬于觀察者模式中的消息發(fā)布和訂閱者,AMS屬于中間的處理中心;

  • 廣播發(fā)送者和廣播接收者的執(zhí)行是異步的,發(fā)出去的廣播不會關(guān)心有無接收者接收,也不確定接收者到底是何時才能接收到;

  • 對于不同的廣播類型、不同BroadcastReceiver的注冊方式,具體實現(xiàn)上會有不同。但總體流程大致如上。

使用流程介紹

具體使用流程如下:

  1. 自定義廣播接收者BroadcastReceiver子類,并復(fù)寫onRecvice()方法;

  2. 通過Binder機(jī)制向AMS(Activity Manager Service)進(jìn)行注冊;

  3. 廣播發(fā)送者通過Binder機(jī)制向AMS發(fā)送廣播;

  4. AMS查找符合相應(yīng)條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發(fā)送到BroadcastReceiver(一般情況下是Activity)相應(yīng)的消息循環(huán)隊列中;

  5. 消息循環(huán)執(zhí)行拿到此廣播,回調(diào)BroadcastReceiver中的onReceive()方法。

    注意

BroadcastReceiver的生命周期只有十秒左右,如果在 onReceive() 內(nèi)做超過十秒內(nèi)的事情,就會報錯 。如果需要處理耗時的業(yè)務(wù),我們可以開啟Service進(jìn)行處理,謹(jǐn)記一點:廣播主要目的是監(jiān)聽獲取通知,不要處理繁雜的業(yè)務(wù)。

broadCast分類

一、從發(fā)送方分類:

? ? ? 系統(tǒng)廣播

? ? ? 用戶自定義廣播

? 二、從類型分類:

普通廣播?(Normal broadcast)

-?所有監(jiān)聽該廣播接受者都可以監(jiān)聽到該廣播

-?同級別接收先后順序是隨機(jī)的(無序)

-?級別低的后收到廣播

-?接收器不能截斷廣播的繼續(xù)傳播,也不能處理廣播

-?同級別動態(tài)注冊高于靜態(tài)注冊

有序廣播?(Oredered broadcast)

-?按照接收者的優(yōu)先順序來接收廣播,優(yōu)先級別在intent-filter中的priority中聲明,-1000到1000之間,值越大優(yōu)先級越高,可以終止廣播的繼續(xù)傳播,接受者可以修改intent的內(nèi)容。

-?同級別接收順序是隨機(jī)的

-?級別低的后收到

-?能截斷廣播的繼續(xù)傳播,高級別的廣播接收器接收廣播后能決定時候截斷。

-?能處理廣播

-?同級別動態(tài)注冊高于靜態(tài)注冊

異步廣播?(粘滯性滯留廣播)?

-?不能處理結(jié)果給下一個接收者,無法終止廣播。

-?一直存在

-?可以先發(fā)送廣播,再注冊接收器

-?需要在清單文件添加android.permission.BROADCAST_STICKY權(quán)限

本地廣播?

-?只能在本應(yīng)用程序中接收到。

-?本地廣播是無法通過靜態(tài)注冊來實現(xiàn)的。

廣播接收器注冊

注冊的方式分為兩種:靜態(tài)注冊、動態(tài)注冊

1 靜態(tài)注冊

  • 在AndroidManifest.xml里通過<receive>標(biāo)簽聲明

  • 屬性說明:

<receiver?????android:enabled=["true"?|?"false"]//此broadcastReceiver能否接收其他App的發(fā)出的廣播//默認(rèn)值是由receiver中有無intent-filter決定的:如果有intent-filter,默認(rèn)值為true,否則為false????android:exported=["true"?|?"false"]????android:icon="drawable?resource"????android:label="string?resource"//繼承BroadcastReceiver子類的類名????android:name=".mBroadcastReceiver"//具有相應(yīng)權(quán)限的廣播發(fā)送者發(fā)送的廣播才能被此BroadcastReceiver所接收;????android:permission="string"//BroadcastReceiver運行所處的進(jìn)程//默認(rèn)為app的進(jìn)程,可以指定獨立的進(jìn)程//注:Android四大基本組件都可以通過此屬性指定自己的獨立進(jìn)程????android:process="string"?>//用于指定此廣播接收器將接收的廣播類型//本示例中給出的是用于接收網(wǎng)絡(luò)狀態(tài)改變時發(fā)出的廣播?<intent-filter><action?android:name="android.net.conn.CONNECTIVITY_CHANGE"?/>????</intent-filter></receiver>

  • 注冊示例:


<receiver ? //此廣播接收者類是mBroadcastReceiver ?android:name=".mBroadcastReceiver" > ?//用于接收網(wǎng)絡(luò)狀態(tài)改變時發(fā)出的廣播 ?<intent-filter> ? ? ?<action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> ?</intent-filter></receiver>


當(dāng)此App首次啟動時,系統(tǒng)會自動實例化mBroadcastReceiver類,并注冊到系統(tǒng)中。

2 動態(tài)注冊

在代碼中通過調(diào)用Context的registerReceiver()方法進(jìn)行動態(tài)注冊BroadcastReceiver,具體代碼如下:

@Override??protected?void?onResume(){??????super.onResume();????//實例化BroadcastReceiver子類?&??IntentFilter?????mBroadcastReceiver?mBroadcastReceiver?=?new?mBroadcastReceiver();?????IntentFilter?intentFilter?=?new?IntentFilter();????//設(shè)置接收廣播的類型?????intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);????//調(diào)用Context的registerReceiver()方法進(jìn)行動態(tài)注冊?????registerReceiver(mBroadcastReceiver,?intentFilter);?}//注冊廣播后,要在相應(yīng)位置記得銷毀廣播//即在onPause()?中unregisterReceiver(mBroadcastReceiver)//當(dāng)此Activity實例化時,會動態(tài)將MyBroadcastReceiver注冊到系統(tǒng)中//當(dāng)此Activity銷毀時,動態(tài)注冊的MyBroadcastReceiver將不再接收到相應(yīng)的廣播。?@Override?protected?void?onPause()?{?????super.onPause();??????//銷毀在onResume()方法中的廣播?????unregisterReceiver(mBroadcastReceiver);?????}}



第六章 組件通訊與廣播消息(廣播與廣播接收器 )的評論 (共 條)

分享到微博請遵守國家法律
沾益县| 奉节县| 九台市| 三穗县| 谢通门县| 蒲城县| 吉木乃县| 宝坻区| 景东| 黔西县| 柘城县| 资溪县| 朝阳县| 喜德县| 聊城市| 赣榆县| 通江县| 北辰区| 永嘉县| 锡林浩特市| 凉城县| 灵石县| 三穗县| 论坛| 微山县| 略阳县| 朝阳区| 东乡族自治县| 玉溪市| 濉溪县| 永寿县| 新密市| 黔东| 龙里县| 盖州市| 和平区| 韶关市| 新龙县| 昌黎县| 东安县| 上栗县|