1. 程式人生 > >從0系統學Android--5.2 傳送廣播

從0系統學Android--5.2 傳送廣播

### 從0系統學Android--52 傳送廣播 ![](https://user-gold-cdn.xitu.io/2019/11/13/16e63adec6819e45?w=1741&h=1541&f=png&s=301835) ![](https://user-gold-cdn.xitu.io/2019/11/13/16e63adabc8b9d2c?w=1132&h=208&f=png&s=49714) **本系列文章目錄**:[更多精品文章分類](https://mp.weixin.qq.com/s/B8DP0UMg1fup2_sJVtgjMw) **本系列持續更新中....** 初級階段內容參考《第一行程式碼》 ### 5.3 傳送自定義廣播 前面已經學習瞭如何接受廣播了,下面來學習如何傳送自定義廣播,廣播型別分為:標準廣播和有序廣播,下面分別來說一下這兩種廣播如何傳送。 #### 5.3.1 傳送標準廣播 首先我們先建立一個廣播接收器,用來接收我們傳送的自定義廣播。 用靜態廣播來實現 ```java public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show(); } } 這裡 action 裡面寫自己要傳送的廣播的名字就可以了 ``` 隨便在一個頁面添加發送程式碼: ```java buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.my_broadcast"); sendBroadcast(intent); } }); ``` 需要注意一點,上面的這種做法在 Android 8.0前是好用的,**在 8.0 後進行了限制,限制通過靜態註冊來接受隱式廣播[詳見](https://blog.csdn.net/thezprogram/article/details/83341501)。** 其實對於部分隱式廣播也是可以的比如開機廣播 通過這個限制我們可以得到解決辦法有兩種: 1.不通過靜態註冊接收器,通過動態註冊就可以了 2.通過靜態註冊接收器,但是傳送的廣播不要是隱式的。 第一種很簡單,就是動態註冊,這裡不演示了,演示第二種: ```java buttonSend.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.my_broadcast"); // 明確指明要此廣播要傳送給的元件 intent.setComponent(new ComponentName(NetChangeActivity.this, MyReceiver.class)); NetChangeActivity.this.sendBroadcast(intent); } }); ``` 由於廣播是通過 Intent 來進行傳遞的因此我們可以通過 Intent 來攜帶一些資料。 #### 5.3.2 傳送有序廣播 **廣播是一種跨程序的通訊,也就是說可以讓不同的應用程式進行通訊** 如何傳送有序廣播呢? ```java NetChangeActivity.this.sendOrderedBroadcast(intent,null); ``` 這樣就是傳送有序廣播了,第二個引數是與許可權有關,傳入 null 就可以了 那麼如何設定接收器接受的順序呢? ```java
``` 通過 `android:priority` 來設定。同樣接收器在接收到訊息後也可以通過 `abortBroadcast()` 來擷取廣播,讓後面的接收器無法再接受到這條廣播。 ### 5.4 使用本地廣播 前面我們傳送和接受的廣播全部屬於系統全域性廣播,也就是說這些廣播可以被系統中的其他應用程式接收到,並且我們也可以接受到來自其他任何應用的廣播。這樣容易引起安全問題。 為了解決這個問題,Android 引入了一套本地廣播機制,使用這個機制廣播只能夠在程式內部進行傳遞。其實實現很簡單就是通過 `LocalBroadcastManager` 來對廣播進行管理。 下面我們就來列幾個方法就可以了 ```java LocalBroadCastManager localBroadCastManager = LocalBroadCastManager.getInstance(this)// 獲取例項 // 傳送廣播的時候 Intent intent = new Intent("com.broadcst.syd"); localBroadCastManager.senBroadCast(intent); // 註冊廣播接收器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.broadcst.syd"); localBroadCastManager.registerReceiver(localReceiver,intentFilter); // 取消註冊 localBroadCastManager.unregisterReceiver(localReceiver); ``` 其實和之前動態註冊傳送都是一樣的,只是換了一個類來執行而已。 **本地廣播是無法通過靜態註冊的** ,這很好理解,靜態註冊是為了讓應用程式還沒有啟動就能接受廣播,而傳送本地廣播的時候,程式肯定已經啟動了,因此完全不需要靜態註冊了。 **注意這裡的本地指的是當前應用程式內** 使用本地廣播優勢: - 明確的知道傳送的廣播不會離開我們的應用程式,不用擔心洩漏資訊。 - 同樣其他廣播也無法傳送到我們程式內部,不用擔心有安全漏洞。 - 傳送本地廣播比傳送系統全域性廣播將會更