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

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

本系列文章目錄更多精品文章分類

本系列持續更新中.... 初級階段內容參考《第一行代碼》java

5.3 發送自定義廣播

前面已經學習瞭如何接受廣播了,下面來學習如何發送自定義廣播,廣播類型分爲:標準廣播和有序廣播,下面分別來講一下這兩種廣播如何發送。android

5.3.1 發送標準廣播

首先咱們先建立一個廣播接收器,用來接收咱們發送的自定義廣播。安全

用靜態廣播來實現markdown

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 裏面寫本身要發送的廣播的名字就能夠了
複製代碼

隨便在一個頁面添加發送代碼:ide

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 後進行了限制,限制經過靜態註冊來接受隱式廣播詳見 其實對於部分隱式廣播也是能夠的好比開機廣播oop

經過這個限制咱們能夠獲得解決辦法有兩種:學習

1.不經過靜態註冊接收器,經過動態註冊就能夠了this

2.經過靜態註冊接收器,可是發送的廣播不要是隱式的。spa

第一種很簡單,就是動態註冊,這裏不演示了,演示第二種:.net

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);
複製代碼

其實和以前動態註冊發送都是同樣的,只是換了一個類來執行而已。

本地廣播是沒法經過靜態註冊的 ,這很好理解,靜態註冊是爲了讓應用程序尚未啓動就能接受廣播,而發送本地廣播的時候,程序確定已經啓動了,所以徹底不須要靜態註冊了。

注意這裏的本地指的是當前應用程序內

使用本地廣播優點:

  • 明確的知道發送的廣播不會離開咱們的應用程序,不用擔憂泄漏信息。
  • 一樣其餘廣播也沒法發送到咱們程序內部,不用擔憂有安全漏洞。
  • 發送本地廣播比發送系統全局廣播將會更加高效
相關文章
相關標籤/搜索