廣播
系統在運行中會產生很多事件,某些特定的事件產生時(如 低電量、開機、應用安裝卸載、收發短信、屏幕解鎖等等),系統會發送廣播通知。當應用收到廣播時根據情況作出相應反應。
創建廣播接受者(BroadcastReceiver)
- 創建Java類繼承自 BroadcastReceiver
- 在清單文件中配置 IntentFilter 屬性中配置 action 屬性
- 添加權限
<receiver android:name=".MyReceiver">
<intent-filter>
<!--接收打電話廣播-->
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
收到廣播後可以自onReceive 方法裏做自己的操作:
public void onReceive(Context context, Intent intent) {
System.out.println("收到打電話廣播");
System.out.println("攔截電話號碼:" + getResultData());
setResultData("110");
}
通過 getResultData 獲取電話號碼,setResultData 重新設置電話號碼。
- 即使廣播接收者所在的應用進程被殺死,當相應的廣播發出後,只要匹配成功,就會自動啓動該進程。
<receiver android:name=".MyReceiver">
<intent-filter android:priority="1000">
<!--接收打電話廣播-->
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
設置優先級 android:priority=”1000” 理論上是 -1000~+1000 實際上可以更大 比如 int的最大值 優先級越高越先收到。
abortBroadcast();攔截廣播 只對有序廣播有效 無序廣播不能攔截
4.0之後,如果應用沒有啓動過,廣播接收者不會生效。
用戶手動關閉應用之後不會再次啓動(強制關閉)
發送自定義廣播
使用 Intent 發送廣播。
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendBroadcast(intent);
如果需要接收此廣播,只需要創建一個廣播接收者,使其 action 匹配。
發送有序廣播
Intent intent = new Intent();
intent.setAction("com.gechao.test.custom");
sendOrderedBroadcast(intent, null, null, null, 0, "這是廣播內容", null);
發送有序廣播
----------
參數解析:
public void sendOrderedBroadcast(
Intent intent, String receiverPermission, BroadcastReceiver resultReceiver,
Handler scheduler, int initialCode, String initialData,
Bundle initialExtras) {
mBase.sendOrderedBroadcast(intent, receiverPermission,
resultReceiver, scheduler, initialCode,
initialData, initialExtras);
}
-----------------
receiverPermission 是指接收權限
initialCode 類似於請求碼
initialData 廣播內容 如果內容簡單 直接在這裏設置
initialExtras 廣播內容 複雜數據傳遞
resultReceiver 最終接收者 一定會收到 最後收到 不論是否攔截 並且不需要再清單文件中配置
- 在每一層都可以做修改,甚至攔截
class ResultReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("最終接收者");
}
}
廣播的動態註冊和靜態註冊
public void register(View view) {
// 註冊廣播接收
myReceiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.gechao.test"); //只有持有相同的action的接受者才能接收此廣播
registerReceiver(myReceiver, filter);
}
public void send(View view) {
Intent intent = new Intent();
intent.setAction("com.gechao.test");
sendBroadcast(intent);
}
public void unregister(View view) {
if (myReceiver != null) {
unregisterReceiver(myReceiver);
}
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("收到廣播");
}
}