Android 广播机制以及用法详解 (转)
轉(zhuǎn):http://blog.sina.com.cn/s/blog_5da93c8f010178zl.html
參考:http://blog.sina.com.cn/s/blog_80723de801014e2g.html http://blog.csdn.net/jjaze3344/article/details/7259272 一、什么是廣播? 在android里面有各種各樣的廣播,比如電池的使用狀態(tài),電話的接受和短信的接受都會產(chǎn)生一個廣播,應(yīng)用程序也可以接受廣播并做出程序邏輯上的處理。 二、廣播的類型 BroadcastReceiver所對應(yīng)的廣播分兩類:普通廣播和有序廣播。 1、普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結(jié)果傳遞給下一個接收者,并且無法終止廣播Intent的傳播。 普通廣播通過Context.sendBroadcast()方法來發(fā)送,所有的receivers接收器接收broadcast的順序不確定。這種方式效率更高,但是BroadcastReceiver無法使用setResult系列,getResult系列及abort系列API。 2、有序廣播是按照接收者聲明的優(yōu)先級別,被接收者依次接收廣播。如:A的級別高于B,B的級別高于C,那么廣播先傳給A,再傳給B,最后傳給C 。優(yōu)先級別聲明在 intent-filter 元素的android:priority 屬性中,數(shù)越大優(yōu)先級別越高。 可以通過在intent-filter中設(shè)置android:priority屬性來設(shè)置receiver的優(yōu)先級,優(yōu)先級相同的receiver其執(zhí)行順序不確定。如果BroadcastReceiver是代碼中注冊的話,且其intent-filter擁有相同android:priority屬性的話,先注冊的將先收到廣播。?
有序廣播的接收者可以終止廣播Intent的傳播,廣播Intent的傳播一旦終止,后面的接收者就無法接收到廣播。 有序廣播是通過Context.sendOrderedBroadcast來發(fā)送,所有的receiver依次執(zhí)行。系統(tǒng)會根據(jù)接收者聲明的優(yōu)先級別按順序逐個執(zhí)行接收者,前面的接收者有權(quán)終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,后面的接收者就再也無法獲取到廣播。 對于有序廣播,前面的接收者可以將數(shù)據(jù)通過setResultExtras(Bundle)方法存放進結(jié)果對象,然后傳給下一個接收者,下一個接收者通過代碼: Bundle bundle = getResultExtras(true)) 可以獲取上一個接收者存入在結(jié)果對象中的數(shù)據(jù)。這里接收短信的廣播是有序廣播,因此可以設(shè)置你自己的廣播接收器的級別高于系統(tǒng)原來的級別,就可以攔截短信,并且不存收件箱,也不會有來信提示音。
實現(xiàn)方法是:
?
<receiver?android:name=".SmsReceiver"?><intent-filter android:priority="2147483647"?>
<action?android:name="android.provider.Telephony.SMS_RECEIVED"?/>?
</intent-filter>
</receiver>
里面的android:priority="2147483647",就是設(shè)定廣播接收器的級別,intent-filter 標(biāo)簽中的 priority 是設(shè)置廣播接收器的優(yōu)先級,網(wǎng)上很多資料都表示,優(yōu)先級的設(shè)置數(shù)值為1000~-1000,1000最大,但事實上,當(dāng) priority 值為integer 的最大值才時,才是優(yōu)先級最高的,即??2147483647;當(dāng)然,“最高”只是限于靜態(tài)注冊。
?
?兩種注冊BroadcastReceiver的方法:
??1.在應(yīng)用程序的代碼中進行注冊
???注冊:BroadcastReceiver
????IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");???
????filter.setPriority(2147483647);
???receiver=new BroadReceiver();
???registerReceiver(receiver,filter);
??
??取消注冊BroadcastReceiver
????unregisterReceiver(receiver);
??2.在AndroidManifest.xml當(dāng)中進行注冊
???<receiver android:name="SMSReceiver">
????<intent-filter android:priority="2147483647"?>
?????<action android:name="android.provider.Telephony.SMS_RECEIVED" />
????</intent-filter>
???</receiver>
轉(zhuǎn)載于:https://www.cnblogs.com/li-fei/p/4321572.html
總結(jié)
以上是生活随笔為你收集整理的Android 广播机制以及用法详解 (转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在杜甫酒业的发展策略中,他们如何融合文化
- 下一篇: Android,监控ContentPro