Broadcast 廣播 的接收 和傳送
sky-mxc 總結 轉載註明:https://sky-mxc.github.io
Broadcast
在Android中 Broadcast是一種 廣泛運用在引用程式之間傳輸資訊的機制。而BroadcastReceiver 是對傳送出來的Broadcaset進行過濾接受並響應的一類元件。如果不需傳送廣播到別的應用 使用 LocalBroadcastManger就可以了。
傳送和接收流程
傳送和接受的過程:
1. 傳送
首先在需要傳送資訊的地方 ,把要傳送的資訊和用於過濾的資訊(如action 和 category)封裝進intent物件,然後呼叫 Context.sendBroadcast() 、sendOrderBroadcast()或sendStickBroadcast()方法,把intent物件以廣播的形式傳送出去
2. 接收
當intent傳送後,所有已經註冊的BroadcastReceiver會檢查註冊時的IntentFilter是否與傳送的intent匹配。若匹配就會呼叫BroadcastReceiver的onReceiver() 方法。所以 我們定義一個BroadcastReceiver的時候必須實現onReceiver()方法
3. Note:
若在使用sendBroadcast()的方法時指定了接受許可權,則只有在AndroidManifest.xml檔案中聲明瞭對應許可權的BroadcastReceiver才能就收到;
同樣的,如果在註冊BroadcastReceiver時指定了可接受的Broadcast的許可權,則只有在包的AndroidManifest.xml中用標籤聲明瞭。擁有此許可權的Context物件所傳送的Broadcast才能被這個BroadcastReceiver所接收。
廣播型別
*雖然 廣播的傳送和接受都是通過intent類,但是廣播intent完全和 啟動activity的intent不同。BroadcastReceiver是無法看到啟動activity的intent的。同樣的,當你傳送一個Broadcast Intent 是不會去發現或啟動一個activity的。兩者是完全不同的。啟動activity的intent是屬於前臺使用者可以看到的操作,而 Broadcat Intent是後臺操作 。通常使用者是看不到 的。*
兩大類 廣播型別 :- 1. Normal broadcasts(普通廣播) :使用 Context.sendBroadcast ;完全是非同步操作,廣播發出後廣播的所有接受者通常都在同一時間執行並得到結果,但是順序不固定。這樣效率是很高的但是 接收器的結果並不能影響其他的接受者- 2. Orderd broadcasts(有序廣播) :同步操作一次傳送到一個接受者 ,按照預先宣告的順序依次接受,(-1000~1000)優先順序高的優先接受到廣播,優先順序高的可以更改廣播或者完全終止這個廣播(abortBroadcast()),那優先順序低的接受者將不能接受到
接收發送的資料
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG,"==action:"+intent.getAction()+"===time:"+ SystemClock.currentThreadTimeMillis());
Log.i(TAG,"==type:"+intent.getStringExtra("type"));
}
}
傳送有序廣播
使用 sendOrderedBroadcast() 如果接受者不需要許可權 設定為null即可
Intent orderIntent = new Intent("com.mxc.example.broadcast.order");
orderIntent.putExtra("type","order");
//不新增許可權
sendOrderedBroadcast(orderIntent,null);
可以通過 priority 屬性來設定接受者的優先順序,優先順序的接受者可以 終止廣播的傳送或者 新增額外的資料或者修改 傳送的廣播資料
終止 廣播
if (intent.getAction().equals("com.mxc.example.broadcast.order")){
//終止廣播
abortBroadcast();
}
新增或者修改資料
//增加額外的結果
Bundle b = getResultExtras(true);//獲取資料 如果沒有就建立
b.putString("result","MyReceiver");
setResultExtras(b);
獲取 額外的資料
Log.e(TAG,"==result:"+getResultExtras(true).getString("result"));
Log 資訊
I/MyReceiver: ==action:com.mxc.example.broadcast.order===time:390
I/MyReceiver: ==type:order
I/SecondReceiver: ==action:com.mxc.example.broadcast.order===time:391
I/SecondReceiver: ==type:order
E/SecondReceiver: ==result:MyReceiver本地廣播
本地廣播和廣播的操作幾乎是一致的不過是使用 LocalBroadcastManager 來管理的;傳送的註冊都是 LocalBroadcastManager例項來管理
本地廣播和 廣播一樣 分為 非同步廣播和同步廣播
傳送本地廣播
Intent localIntent = new Intent("com.example.broadcast.local.async");
manager.sendBroadcast(localIntent);
//傳送 同步的(有序)的廣播
//manager.sendBroadcastSync(localIntent);
接收本地廣播
manager = LocalBroadcastManager.getInstance(this);
receiver = new LocalReceiver();
IntentFilter filter = new IntentFilter("com.example.broadcast.local.async");
manager.registerReceiver(receiver,filter);
各種廣播
android.intent.action.SCREEN_ON 螢幕關閉 規定 只有動態註冊才可以
android.net.conn.CONNECTIVITY_CHANGE 網路狀態改變
特別感謝: 本文中的圖 都是從菜鳥扒的
