從0系統學Android--52 發送廣播
本系列文章目錄:更多精品文章分類
本系列持續更新中.... 初級階段內容參考《第一行代碼》
5.3 發送自定義廣播
前面已經學習了如何接受廣播了,下面來學習如何發送自定義廣播,廣播型別分為:標準廣播和有序廣播,下面分別來說一下這兩種廣播如何發送,
5.3.1 發送標準廣播
首先我們先創建一個廣播接收器,用來接收我們發送的自定義廣播,
用靜態廣播來實作
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show();
}
}
<receiver
android:name="com.example.firstcode.fifty_chapter.norboardcast.MyReceiver"
android:enabled="true"
android:exported="true"
android:permission="no">
<intent-filter>
<action android:name="com.my_broadcast"/>
</intent-filter>
</receiver>
這里 action 里面寫自己要發送的廣播的名字就可以了
隨便在一個頁面添加發送代碼:
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 后進行了限制,限制通過靜態注冊來接受隱式廣播詳見, 其實對于部分隱式廣播也是可以的比如開機廣播
通過這個限制我們可以得到解決辦法有兩種:
1.不通過靜態注冊接收器,通過動態注冊就可以了
2.通過靜態注冊接收器,但是發送的廣播不要是隱式的,
第一種很簡單,就是動態注冊,這里不演示了,演示第二種:
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 發送有序廣播
廣播是一種跨行程的通信,也就是說可以讓不同的應用程式進行通信
如何發送有序廣播呢?
NetChangeActivity.this.sendOrderedBroadcast(intent,null);
這樣就是發送有序廣播了,第二個引數是與權限有關,傳入 null 就可以了
那么如何設定接收器接受的順序呢?
<intent-filter android:priority="100">
<action android:name="com.my_broadcast.MY_BROADCAST"/>
</intent-filter>
通過 android:priority 來設定,同樣接收器在接收到訊息后也可以通過 abortBroadcast() 來截取廣播,讓后面的接收器無法再接受到這條廣播,
5.4 使用本地廣播
前面我們發送和接受的廣播全部屬于系統全域廣播,也就是說這些廣播可以被系統中的其他應用程式接收到,并且我們也可以接受到來自其他任何應用的廣播,這樣容易引起安全問題,
為了解決這個問題,Android 引入了一套本地廣播機制,使用這個機制廣播只能夠在程式內部進行傳遞,其實實作很簡單就是通過 LocalBroadcastManager 來對廣播進行管理,
下面我們就來列幾個方法就可以了
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);
其實和之前動態注冊發送都是一樣的,只是換了一個類來執行而已,
本地廣播是無法通過靜態注冊的 ,這很好理解,靜態注冊是為了讓應用程式還沒有啟動就能接受廣播,而發送本地廣播的時候,程式肯定已經啟動了,因此完全不需要靜態注冊了,
注意這里的本地指的是當前應用程式內
使用本地廣播優勢:
- 明確的知道發送的廣播不會離開我們的應用程式,不用擔心泄漏資訊,
- 同樣其他廣播也無法發送到我們程式內部,不用擔心有安全漏洞,
- 發送本地廣播比發送系統全域廣播將會更加高效
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/25155.html
標籤:Android
