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