韩国三级高清手机在线版-韩国三级电影久久-韩国三级hd中文字幕一男多女-韩国三级hd中文字幕久久精品-日本精品在线视频-日本精品在线观看视频

BroadCastReceiver 簡介 (末尾有源碼)

BroadCastReceiver 源碼位于: framework/base/core/java/android.content.BroadcastReceiver.java

 

廣 播接收者( BroadcastReceiver )用于接收廣播 Intent ,廣播 Intent 的發送是通過調用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 來實現的。通常一個廣播 Intent 可以被訂閱了此 Intent 的多個廣播接收者所接收。

 

廣播是一種廣泛運用的在應用程序之間傳輸信息的機制 。而 BroadcastReceiver 是對發送出來的廣播進行過濾接收并響應的一類組件;

 

來自普通應用程序,如一個應用程序通知其他應用程序某些數據已經下載完畢。

 BroadcastReceiver 自身并不實現圖形用戶界面,但是當它收到某個通知后, BroadcastReceiver 可以啟動 Activity 作為響應,或者通過 NotificationMananger 提醒用戶,或者啟動 Service 等等。

BroadCastReceiver 的機制

1. 機制

在  Android  里面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播并做出程序邏輯的處理。如圖:


 

2. 實現

用接收短信舉例:

 

第一種方式

實現

public   class MyBroadcastReceiver extends BroadcastReceiver {

 

      // action 名稱

     String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

 

      public   void onReceive(Context context, Intent intent) {

 

         if (intent.getAction().equals( SMS_RECEIVED )) {

             // 相關處理 : 地域變換、電量不足、來電來信;

        }

     }

}

系統注冊:在 AndroidManifest.xml 中注冊

< receiver android:name = ".MyBroadcastReceiver" >

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

                

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

             </ intent-filter >

         </ receiver > 當然了需要權限

 

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

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

 

 

第二種方式:

 

// 廣播接收者 - 廣播的接收

private BroadcastReceiver myBroadcastReceiver   = new BroadcastReceiver() {

 

         @Override

         public   void onReceive(Context context, Intent intent) {

             // 相關處理,如收短信,監聽電量變化信息

        }

 

     };

 

代碼中注冊:

IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );

registerReceiver( mBatteryInfoReceiver , intentFilter);

 

3. 生命周期

 

描述了 Android  中廣播的生命周期,其次它并不像 Activity  一樣復雜,運行原理很簡單如下圖:


 

 

生命周期只有十秒左右,如果在 onReceive() 內做超過十秒內的事情,就會報錯

 

每 次廣播到來時 , 會重新創建 BroadcastReceiver 對象 , 并且調用 onReceive() 方法 , 執行完以后 , 該對象即被銷毀 . 當 onReceive() 方法在 10 秒內沒有執行完畢, Android 會認為該程序無響應 . 所以在

BroadcastReceiver 里不能做一些比較耗時的操作 , 否側會彈出 ANR(Application No  

Response) 的對話框 . 。(如圖):

 

怎么用好 BroadcastReceiver

如果需要完成一項比較耗時的工作 , 應該通過發送 Intent 給 Service, 由 Service 來完成 . 這里不能使用子線程來解決 , 因為 BroadcastReceiver 的生命周期很短 , 子線程可能還沒有結束

BroadcastReceiver 就先結束了 .BroadcastReceiver 一旦結束 , 此時 BroadcastReceiver 的

所在進程很容易在系統需要內存時被優先殺死 , 因為它屬于空進程 ( 沒有任何活動組件的進程 ). 如果它的宿主進程被殺死 , 那么正在工作的子線程也會被殺死 . 所以采用子線程來解決是不可靠的 .

 

廣播類型及廣播的收發

廣播類型

普通廣播 (Normal broadcasts)

   發送一個廣播,所以監聽該廣播的廣播接收者都可以監聽到改廣播。

異步廣播 ,   當處理完之后的Intent ,依然存在,這時候registerReceiver(BroadcastReceiver, IntentFilter) 還能收到他的值,直到你把它去掉 , 不能將處理結果傳給下一個接收者 , 無法終止廣播 .

 

有序廣播 (Ordered broadcasts)

按照接收者的優先級順序接收廣播 , 優先級別在 intent-filter 中的 priority 中聲明 ,-1000 到

1000 之間 , 值越大 , 優先級越高 . 可以終止廣播意圖的繼續傳播 . 接收者可以篡改內容 .

 

 

 

廣播的收發

該組件接收被廣播的 intent,Context 可以通過 sendBroadcast() 和 sendOrderedBroadcast()

方法實現廣播的發送 .

首先在需要發送信息的地方 ,把要發送的信息和用于過濾的信息 ( 如 Action 、 Category) 裝入一個 Intent 對象 ,然后通過調用  Context.sendBroadcast() 、 sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把  Intent 對象以廣播方式發送出去。

 

使用 sendBroadcast()  或 sendStickyBroadcast() 方法發出去的 Intent ,所有滿足條件的 BroadcastReceiver 都會隨機地執行其 onReceive() 方法

普通廣播的發送和接收:

sendBroadcast(intent);

 

Intent intent = new Intent( "cn.lenovo.yangguangf " );

         sendBroadcast(intent);

priority :這個是 AndroidManifest.xml intent-filter 的參數。

 

< receiver android:name = ".MyBroadcastReceiver" >

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

                

< action android:name = "cn.lenovo.yangguangfu" />

</ intent-filter >

</ receiver >

 

sendOrderedBroadcast(intent, receiverPermission);

 

1 ,他決定該廣播的級別,級別數值是在 -10001000 之間 , 值越大 , 優先級越高;

 

2 ,同級別接收是先后是隨機的;級別低的收到廣播;

3 ,在 android 系統中只要監聽該廣播的接收者,都能夠收到 sendBroadcast(intent) 發出的廣播 ;

 

3 ,不能截斷廣播的繼續傳播,

 

4 ,實驗現象,在這個方法發來的廣播中,代碼注冊方式中,收到的廣播的先后和注明優先級最高的他們的先后是隨機。如果都沒有優先級,代碼注冊收到為最先。

有序廣播的發送和接收:

sendOrderedBroadcast(intent, receiverPermission);

sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

         scheduler, initialCode, initialData, initialExtras)

意圖,廣播,所有匹配的這一意圖將接收機接收廣播。

receiverPermission 這是權限,一個接收器必須持以接收您的廣播。如果為 null ,不經許可的要求。
resultReceiver 您自己 BroadcastReceiver 來當作最后的廣播接收器。
調度自定義處理程序,用以安排 resultReceiver 回調 ; 如果為 null 將語境中的主線程舉行。
initialCode 一種結果代碼的初始值。通常為 Activity.RESULT_OK 。這個值是 -1 ;為其他 int 型  也可以,如 0,1,2 ;
initialData 一種結果數據的初始值。通常情況下為空 , 是 String 類型 ;
initialExtras 一種結果額外的初始值。通常情況下為空 , 是 Bundle;

 

intent The Intent to broadcast; all receivers matching this Intent will receive the broadcast.

receiverPermission String naming a permissions that a receiver must hold in order to receive your broadcast. If null, no permission is required.

resultReceiver Your own BroadcastReceiver to treat as the final receiver of the broadcast.

scheduler A custom Handler with which to schedule the resultReceiver callback; if null it will be scheduled in the Context's main thread.

initialCode An initial value for the result code. Often Activity.RESULT_OK.

initialData An initial value for the result data. Often null.

initialExtras An initial value for the result extras. Often null.

1,    該廣播的級別有級別之分,級別數值是在 -10001000 之間 , 值越大 , 優先級越高;

2,    同級別接收是先后是隨機的,再到級別低的收到廣播;

3,    同級別接收是先后是隨機的,如果先接收到的把廣播截斷了,同級別的例外的接收者是無法收到該廣播的。( abortBroadcast()

 

4 ,能截斷廣播的繼續傳播,高級別的廣播收到該廣播后,可以決定把該鐘廣播是否截斷掉。

5 ,實驗現象,在這個方法發來的廣播中,代碼注冊方式中,收到廣播先后次序為:注明優先級的、代碼注冊的、沒有優先級的;如果都沒有優先級,代碼注冊收到為最先。

 

 

異步廣播的發送和接收:

sendStickyBroadcast(intent);

當處理完之后的Intent ,依然存在,直到你把它去掉。

發這個廣播需要權限<uses-permission android:name="android.permission.BROADCAST_STICKY" />  

去掉是用這個方法removeStickyBroadcast(intent); 但別忘了在執行這個方法的應用里面 AndroidManifest.xml 同樣要加上面的權限;

 

 

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

        initialCode, initialData, initialExtras)

這個方法具有有序廣播的特性也有異步廣播的特性;

 


發送這個廣播要: <uses-permission android:name="android.permission.BROADCAST_STICKY"  /> 這個權限。才能使用這個方法。如果您并不擁有該權限,將拋出 SecurityException 的。

 

實驗現象( sendStickyOrderedBroadcast ()中),在這個方法發來的廣播中,代碼注冊方式中,收到廣播先后次序為:注明優先級的、代碼注冊的、沒有優先級的;如果都沒有優先級,代碼注冊收到為最先。

 

廣播注冊與注銷

代碼中注冊廣播:

注 冊廣播方法一: registerReceiver(BroadcastReceiver receiver, IntentFilter filter) ,第一個參數是我們要處理廣播的 BroadcastReceiver (廣播接收者,可以是系統的,也可以是自定義的);第二個參數是意圖過濾器。

 

注冊廣播方法二: registerReceiver(receiver, filter, broadcastPermission, scheduler) ,第一個參數是 BroadcastReceiver (廣播接收者,可以是系統的,也可以是自定義的);第二個參數是意圖過濾器;第三個參數是廣播權限;第四個參數是 Hander ;

 

注意:權限重復現象,如果功能清單文件里注冊了權限,在該方法再注冊,則 receiver 無法收到廣播,如果 功能清單文件里沒有注冊了權限,該方法注冊也無法收到。當該方法沒有注冊權限,功能清單里注冊的時候, receiver 能收到廣播。

 

 

總結:在 Activity 中代碼注冊廣播建議在: onResume() 中注冊;

 

思 維拓展: 1 ,如果在代碼調用 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 十次( receiver , filter 的參數是同一參數),那么是否當該廣播發送來的時候會收到十次呢?

 

        2 ,注銷是否也要注銷十次才能把廣播全部注銷呢?

 

系統中注冊廣播:(在 AndroidManifest.xml 中 )

< receiver android:name = ".MyBroadcastReceiver" >

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

                

                < action android:name = "cn.lenovo.yangguangfu" />

             </ intent-filter >

</ receiver >

 

有時候還要根據發送廣播是否指定權限,來決定是否要權限;

 

廣播注銷

 

// 代碼中注銷廣播

/unregisterReceiver(mBatteryInfoReceiver);

?

 

在 Activity 中代碼注銷廣播建議在: onPuase()   中注銷;

不要這這里面注銷 Activity.onSaveInstanceState(), 因為這個方法是保存 Intent 狀態的。

 

BroadCastReceiver 的 API

abortBroadcast  ():

這個方法可以截獲由 sendOrderedBroadcast () 發送來的 廣播,讓其它廣播接收者無法收到這個廣播。

clearAbortBroadcast   ()  

這個方法是針對上面的 abortBroadcast()  方法的,用于取消截獲廣播。這樣它的下一級廣播接收者就能夠收到該廣播了。  

getAbortBroadcast   ()  

這 個方法作用是:判斷是否調用了 abortBroadcast  (),如果先調用 abortBroadcast  (),接著再調用 getAbortBroadcast  (),將返回 true;   如果在調用 abortBroadcast()  、 clearAbortBroadcast   ()  

getAbortBroadcast  (),將返回 false;  

   

public final boolean   getDebugUnregister   ()  

Since: API Level 1  

Return the last value given to setDebugUnregister(boolean) .  

 

 

getResultCode   ()  

如果用下面四個方法發送得廣播,返回碼為: -1 ;

// sendBroadcast(intent);

// sendBroadcast(intent, receiverPermission);

// sendOrderedBroadcast(intent, receiverPermission);

// sendStickyBroadcast(intent);

如果用下面兩個方法發送得廣播,返回碼為:根據你設置 initialCode 的數字是多少就是多少;

// sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

// initialCode, initialData, initialExtras)

// sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

// scheduler, initialCode, initialData, initialExtras)

 

 

getResultData   ()  

得到發送廣播時設置的 initialData 的數據;

 

 

getResultExtras (boolean makeMap)

If true then a new empty Map will be made for you if the current Map is null; if false you should be prepared to receive a null Map.

得到由

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

// initialCode, initialData, initialExtras)

 

// sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

// scheduler, initialCode, initialData, initialExtras)

initialExtras 傳入的參數。

實驗:我用上面兩個方法發了 initialExtras (這個一個 Bundle )傳入的參數時,只要不為空,那么 makeMap 是否為 true 和 false 都能夠得到數據。

 

isInitialStickyBroadcast   ()  

Returns true if the receiver is currently processing the initial value of a sticky broadcast -- that is, the value that was last broadcast and is currently held in the sticky cache, so this is not directly the result of a broadcast right now.

 

如果廣播接收者是目前處理的一個宿主的廣播的初始值,將返回 true , -  也就是說,這個值是最后的廣播出的值,目前正在舉行的宿主緩存,所以這并不是直接導致了現在的廣播。

 

實驗:在第三個應用中調用這個方法,無論你用哪種方式發送廣播,這個方法得到的總是 false ;在發送廣播 的 resultReceiver 廣播接收者里面調用,得到的也是 false

 

 

isOrderedBroadcast   ()  

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

  initialCode, initialData, initialExtras)

上面這個方法發送時,得到的是 true;

判斷是否是有序廣播;

 

 

onReceive (Context context, Intent intent)

 

public IBinder peekService (Context myContext, Intent service)

Provide a binder to an already-running service. This method is synchronous and will not start the target service if it is not present, so it is safe to call from onReceive.

 

Parameters:

myContext The Context that had been passed to onReceive(Context, Intent)

service The Intent indicating the service you wish to use. See Context.startService(Intent) for more information.

setDebugUnregister (boolean debug)

Control inclusion of debugging help for mismatched calls to {@ Context#registerReceiver(BroadcastReceiver, IntentFilter) Context.registerReceiver()}. If called with true, before given to registerReceiver(), then the callstack of the following  Context.unregisterReceiver()  call is retained, to be printed if a later incorrect unregister call is made. Note that doing this requires retaining information about the BroadcastReceiver for

 

穩定

產品高可用性高并發

貼心

項目群及時溝通

專業

產品經理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質開發
  • 返回頂部
午夜阳光精品一区二区三区| 中文日产无乱码AV在线观| 欧美多人片高潮野外做片黑人 | 日韩揉捏奶头高潮不断视频| 乱人伦中文字幕成人网站在线| 狠狠躁夜夜躁人人躁婷婷| 国产AVXXXX无套内射| おまえの母亲をだます怎么读| 中国老太太X×××XHD| 亚洲熟妇无码八AV在线播放| 亚洲VA久久久噜噜噜久久无码| 无码抽搐高潮喷水流白浆| 色老板在线永久免费视频| 热久久美女精品天天吊色 | 亚洲高清AⅤ日本欧美视频| 色欲色香天天天综合VVV| 日本WWW一道久久久免费| 欧洲精品不卡1卡2卡三卡| 农民人伦一区二区三区| 男男GAYGAY无套GAY无套| 麻花传媒CEO免费观看| 老师你的兔子好软水好多小时| 久久人妻XUNLEIGE无码| 久久久久久精品免费免费麻辣| 精品亚洲自慰AV无码喷奶水| 精品97国产免费人成视频| 黑人巨大进入白人美女视频| 国产一区二区精品久久岳| 国产免费久久精品99久久| 国产精品沙发系列| 国产区精品福利在线社区| 国产内射爽爽大片视频社区在线| 国产精品无码素人福利| 国产无遮挡裸体美女视频| 国精产品砖一区二区三区糖心| 国产内射老熟女AAAA∵| 国产精品一区二区久久不卡| 国产无套粉嫩白浆在线观看| 国产亚洲美女精品久久久| 国色精品卡一卡2卡3卡4卡在线| 含羞草自慰抽搐喷白浆AⅤ| 黄桃AV无码免费一区二区三区| 禁18在线观看免费网站| 九九电影网午夜理论片| 久久久久人妻一区精品色| 麻花传媒MV在线播放高清MBA| 免费无码又黄又爽又刺激| 欧美日韩精品SUV| 日本成熟少妇喷浆在线观看| 色欲综合久久躁天天躁蜜桃| 熟妇高潮一区二区精品视频| 无码人妻在线视频| 亚洲国产精品无码久久九九大片| 亚洲色偷无码一区二区蜜桃AV| 又爽又刺激免费男女视频| 69无人区码一码二码三码区别| OM老熟妇DHXⅩXXX| 丰满少妇大力进入| 国产亚洲欧美日韩二三线| 精品无码国产自产拍在线观看蜜桃 | 麻豆精品一区二正一三区| 欧美XXXXX高潮喷水| 日本高清乱理伦片中文字幕| 丝袜高潮流白浆潮喷在线播放 | 亚洲AV无码一区二区三区乱码4| 亚洲精品TY久久久久久久久久| 一二三四中文字幕在线看| 97超级碰碰碰久久久久| 产精品无码久久_亚洲国产精| 国产V亚洲V天堂A无码| 国精产品999一区二区三区有限 | 99国产精品欧美一区二区三区| XXXCHINESE国产HD| 国产高清在线观看AV片| 激情综合色综合久久综合| 美女爆乳裸体WWW免费网站| 拍国产乱人伦偷精品视频| 无码成人一区二区三区| 亚洲伊人五月丁香激情| 99久久免费精品国产72精品九 | 特级AAAAAAAAA毛片免费| 亚洲AV永久无码精品无码影片 | 欧美AAAAAA级午夜福利视频| 色欲av伊人久久大香线蕉影院| 亚洲AV无码专区在线观看成人| 中国在线观看免费国语版| 处破女轻点疼丨8分钟| 国色天香卡一卡2卡3卡4卡5| 久久综合亚洲鲁鲁九月天| 人与畜禽共性关系的重要性| 性色AV无码专区一ⅤA亚洲| 幼儿免费网站精品幼儿1| 东京热无码AV一区二区| 娇妻在厨房被朋友玩得呻吟| 欧美激情一区二区三区蜜桃| 我的好妈妈中文字幕HD| 阳台顶着岳刘晓莉的肥臀| 成人黄网站高清免费视频| 娇小萝被两个黑人用半米长| 欧美一区二区三区激情| 亚洲AV蜜乳永久www| 2012手机免费观看版国语| 国产AⅤ无码旗袍丝袜美腿| 久久97人人超人人超碰超国产| 人妻丰满妇岳av无码区HD| 亚洲AV永久无码精品国产精品| 97久久精品人人澡人人爽| 国产精品久久午夜夜伦鲁鲁| 久久精品水蜜桃AV综合天堂| 日韩AⅤ无码AV一区二区三区 | 亚洲日韩国产精品第一页一区| FIREEXⅩ性欧美HD护士| 国产又黄又爽胸又大免费视频| 免费男同GAY片AV网站| 天堂AV无码AV在线A√| 又大又长粗又爽又黄少妇毛片| 嗯啊WW免费视频网站| 久久久久久久极品内射| 色妞AV永久一区二区国产AV开| 亚洲色欲色欲WWW在线播放| 成人综合色在线一区二区| 久久精品国产久精国产果冻传媒| 日韩一区二区三区精品视频| 亚洲熟女WWW一区二区三区| 大肉大捧一进一出视频出来呀| 久久久久久精品免费免费| 特级AAAAAAAAA毛片免费| 40岁的寡妇下面紧不紧| 国产专区一线二线三线品牌| 欧洲女人牲交视频免费| 亚洲女同精品一区二区| 地师传人电影在线观看| 久久亚洲AV无码AV男人的天堂| 婷婷成人五月综合激情| 97久久精品无码一区二区天美| 狠狠色成人一区二区三区| 日日摸夜夜添夜夜添影院| 越南少妇毛茸茸的大BBW| 国产日产欧产精品精品APP| 欧美日韩人妻精品| 亚洲午夜精品久久久久久APP | 欧洲码和亚洲码的尺码区别| 亚洲综合网站精品一区二区 | 极品粉嫩小泬无遮挡20P| 日韩精品人妻一区二区三区| 淫荡集团69视频在线观看| 国产乱子伦精品免费无码专区| 人妻含泪让粗大挺进| 亚洲中文精品久久久久久| 国产乱子伦视频在线播放| 人C交ZO〇Z〇〇XX| 夜夜爽妓女8888视频免费观看| 国产精品久久久久久一区二区三区| 欧亚专线欧洲S码W MY| 在线观看激情无码成人AV| 精品高朝久久久久9999| 忘忧草日本在线播放WWW| 啊~每一次都撞到最里面| 美日韩一区二区三区| 亚洲欧美性爱视频在线| 国产偷V国产偷V亚洲高清| 少妇被躁爽到高潮无码人狍大战| CHINESE猛攻打桩大学生| 久久夜色精品国产噜噜| 亚洲乱色熟女一区二区三区丝袜| 国产精品泄火熟女| 色综合色狠狠天天综合色| 啊灬啊灬啊灬快高潮了网站 | 甜性涩爱在线播放| 92国产精品午夜福利无毒不卡 | 娜娜麻豆国产电影| 亚洲永久精品wW4791一区| 国产乱子伦农村叉叉叉| 天天躁日日躁狠狠躁裸体| 被义子侵犯的漂亮人妻中字| 男女啪啪免费观看的网址| 野花日本大全免费观看2019 | 一受多攻同做H嗯啊巨肉| 精品人妻一区二区三区免费看 | 不卡无在一区二区三区四区| 男人激烈吮乳吃奶毛片| 一二三四视频社区| 久久精品九九亚洲精品| 亚洲精品白浆高清久久久久久 | 免费看片A级毛片免费看| 一区二区精品视频| 久久精品亚洲精品无码金尊| 亚洲欧洲日产国码无码AV喷潮| 饥渴少妇AV无码影片| 亚洲AV成人一区二区三区在线看 | 日本牲交大片免费观看| АⅤ中文在线天堂| 人妻熟妇乱又伦精品HD| ACTION对魔忍| 欧洲熟妇色XXXXX老妇| 99RIAV国产精品视频| 欧美黑大粗无码免费视频| AV国内精品久久久久影院| 欧美性猛交XXXX黑人猛交| JAZZJAZZ国产精品|