關(guān)鍵字:注冊廣播 BroadcastReceiver
前言:前面文章記錄了Service的使用,這次來記錄另一個四個組件之一的BroadcastReceiver。主要介紹兩種發(fā)送和注冊廣播的區(qū)別。
BroadcastReceiver廣播接收者用于接收系統(tǒng)或其他程序(包括自己程序)發(fā)送的廣播。
一.注冊廣播
在android中,我們?nèi)绻虢邮盏綇V播信息,必須自定義我們的廣播接收者。要寫一個類來繼承BroadcastReceiver,并且重寫其onReceive()方法,實現(xiàn)接收到特定廣播所要做的事情。
這是一個自定義的廣播接收者:
public class MyBroadCastReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
//在這里可以寫相應(yīng)的邏輯來實現(xiàn)一些功能
//可以從Intent中獲取數(shù)據(jù)、還可以調(diào)用BroadcastReceiver的getResultData()獲取數(shù)據(jù)
}
}
我們已經(jīng)定義好了一個廣播接收者。要想使用它接受到廣播,就要注冊這個廣播接收者。
有兩種方式注冊廣播:
(1)代碼中動態(tài)注冊
步驟如下:
- 實例化自定義的廣播接收者
- 實例化意圖過濾器,并設(shè)置要過濾的廣播類型(如,我們接收收到短信系統(tǒng)發(fā)出的廣播)
- 使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注冊廣播
代碼:
//new出上邊定義好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();
//實例化過濾器并設(shè)置要過濾的廣播
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
//注冊廣播
myContext.registerReceiver(smsBroadCastReceiver,intentFilter,
"android.permission.RECEIVE_SMS", null);
(2)在Manifest.xml中靜態(tài)注冊
直接在Manifest.xml文件的<application>節(jié)點中配置廣播接收者。
<receiver android:name=".MyBroadCastReceiver">
<!-- android:priority屬性是設(shè)置此接收者的優(yōu)先級(從-1000到1000) -->
<intent-filter android:priority="20">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
還要在<application>同級的位置配置可能使用到的權(quán)限
<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>
(3)兩種注冊廣播的不同
- 第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。
- 第二種是常駐型,也就是說當(dāng)應(yīng)用程序關(guān)閉后,如果有信息廣播來,程序也會被系統(tǒng)調(diào)用自動運行。
二.發(fā)送廣播
當(dāng)我們需要發(fā)送一個自定義的廣播來通知程序中其他組件一些狀態(tài)時,就可以使用發(fā)送一條廣播的方式。
有兩種方式分別發(fā)送兩種不同的廣播:
通過mContext.sendBroadcast(Intent)或mContext.sendBroadcast(Intent, String)發(fā)送的是無序廣播(后者加了權(quán)限);
通過mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)發(fā)送的是有序廣播。
區(qū)別:
無序廣播:所有的接收者都會接收事件,不可以被攔截,不可以被修改。
有序廣播:按照優(yōu)先級,一級一級的向下傳遞,接收者可以修改廣播數(shù)據(jù),也可以終止廣播事件。
(1)無序廣播的使用:
定義一個按鈕,設(shè)置其點擊事件,發(fā)送一個無序廣播。
Intent intent = new Intent();
//設(shè)置intent的動作為com.example.broadcast,可以任意定義
intent.setAction("com.example.broadcast");
//發(fā)送無序廣播
sendBroadcast(intent);
定義一個廣播接收者,來接收這個廣播事件。通過Toast的打印判斷是否收到廣播
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"收到廣播", Toast.LENGTH_SHORT).show();
}
}
在Manifest.xml中配置該接收者。
<receiver
android:name=".MyReceiver" >
<intent-filter>
<!-- 動作設(shè)置為發(fā)送的廣播動作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
運行結(jié)果為:Toast打印出 “收到廣播”。
(2)有序廣播的使用
和無序廣播使用不同的是 通過 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每個接收者設(shè)置優(yōu)先級,就可以在小于自己優(yōu)先級的接收者得到廣播前,修改或終止廣播。
定義一個按鈕,設(shè)置其點擊事件,發(fā)送一個有序廣播。
Intent intent = new Intent();
//設(shè)置intent的動作為com.example.broadcast,可以任意定義
intent.setAction("com.example.broadcast");
//發(fā)送無序廣播
//第一個參數(shù):intent
//第二個參數(shù):String類型的接收者權(quán)限
//第三個參數(shù):BroadcastReceiver 指定的接收者
//第四個參數(shù):Handler scheduler
//第五個參數(shù):int 此次廣播的標記
//第六個參數(shù):String 初始數(shù)據(jù)
//第七個參數(shù):Bundle 往Intent中添加的額外數(shù)據(jù)
sendOrderedBroadcast(intent, null, null, null, "這是初始數(shù)據(jù)", );
定義多個廣播接收者,來接收這個廣播事件。通過Toast的打印判斷是否收到廣播
public class MyReceiver1 extends BroadcastReceiver {
public MyReceiver1() {
}
@Override
public void onReceive(Context context, Intent intent) {
//獲取廣播中的數(shù)據(jù)(即得到 "這是初始數(shù)據(jù)" 字符串)
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//修改數(shù)據(jù)
setResultData("這是修改后的數(shù)據(jù)");
}
}
public class MyReceiver2 extends BroadcastReceiver {
public MyReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
//終止廣播
abortBroadcast();
}
}
public class MyReceiver3 extends BroadcastReceiver {
public MyReceiver3() {
}
@Override
public void onReceive(Context context, Intent intent) {
String message = getResultData();
Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();
}
}
在Manifest.xml中配置該接收者。并設(shè)置優(yōu)先級:MyReceiver1>MyReceiver2>MyReceiver3。
<!-- 優(yōu)先級相等的話,寫在前面的receiver的優(yōu)先級大于后面的 -->
<receiver
android:name=".MyReceiver1" >
<!-- 定義廣播的優(yōu)先級 -->
<intent-filter android:priority="1000">
<!-- 動作設(shè)置為發(fā)送的廣播動作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2" >
<!-- 定義廣播的優(yōu)先級 -->
<intent-filter android:priority="0">
<!-- 動作設(shè)置為發(fā)送的廣播動作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver3" >
<!-- 定義廣播的優(yōu)先級 -->
<intent-filter android:priority="-1000">
<!-- 動作設(shè)置為發(fā)送的廣播動作 -->
<action android:name="com.example.broadcast"/>
</intent-filter>
</receiver>
運行結(jié)果:MyReceiver1得到廣播數(shù)據(jù)后打印“這是初始數(shù)據(jù)”,MyReceiver2接收到廣播數(shù)據(jù)打印“這是修改后的數(shù)據(jù)”,MyReceiver3沒有打印。