[Android四大組件] Broadcast Receiver 廣播

Broadcast Receiver

  • 什麼是Broadcast Receiver

    • 官方解釋: Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern. These broadcasts are sent when an event of interest occurs. For example, the Android system sends broadcasts when various system events occur, such as when the system boots up or the device starts charging. Apps can also send custom broadcasts, for example, to notify other apps of something that they might be interested in (for example, some new data has been downloaded).

    • 通俗易懂: 也就是一個基站, 可以發送廣播也可以接收廣播.

    • 廣播的分類:

      • 標準廣播: 一種完全異步的廣播, 無法被截斷.

      • 有序廣播: 同步執行的廣播, 廣播分先後順序, 可以被截斷.


  • 廣播的基本使用

    • 廣播的註冊:

      • 代碼中註冊(動態註冊):

        public class MainActivity extends Activity{
            private IntentFilter mIntentFilter;
        
            private DemoBroadcastRecevier mReceiver;
        
            @Overrider
            protected void onCreate(Bundel savedInstance){
                super.onCreate();
                setContentView(R.layout.activity_main);
                intentFilter = new IntentFilter();
                intentFilter.addAction("...");      // 定義監聽操作
                mReceiver = new DemoBroadcastReceiver();
                registerReceiver(mReceiver, intentFilter);
            }
        
            @Override
            protected void onDestroy(){
                super.onDestroy();
                unregisterReceiver(mReceiver);
            }
        
            class DemoBroadcastReceiver extends BroadcastReceiver{
        
                @Override
                public void onReceive(Context context, Intent intent){
                  Toast.makeText(context,"I am thatnight",Toast.LENGTH_SHOT).show();                  
                }
            }
        
        }

        我們在上面分別創建了兩個, 一個是IntentFilter , 這個是一個Intent的過濾器, 用來過濾隱式的Intent, 接收的廣播就是addAction裏面的值了, 然後是一個繼承了BroadCastReceiver的內部類, 並實現了onReceive方法,

      • AndroidManifest.xml註冊(靜態註冊):

         <receiver android:name=".DemoBroadcastReceiver">
        <intent-filter>
            <action android:name="..."></action>
        </intent-filter>
        </receiver>

        靜態註冊很簡單, 比動態註冊還少寫了個IntentFilter。

    • 發送和接收廣播

      我們把之前的action都設爲自定義的 “com.rcd.demoscomponents.WHO_ARE_YOU”

      發送廣播代碼如下:

      Intent sendIntent = new Intent("com.rcd.demoscomponents.WHO_ARE_YOU") ;
      sendBroadcast(sendIntent);

      上面的代碼十分簡單,效果圖如下 :
      這裏寫圖片描述

      • 發送有序廣播:

        上面所發的是一條標準的廣播, 那麼有序廣播該怎麼發送呢? 其實也很簡單, 操作如下:

        新建一個項目, 並寫一個跟上面DemoBroadcastReceiver一樣的類, 總之全都一樣吧, 然後同時運行這兩個app,
        當點擊上面的那個按鈕時, 兩個app都彈出了Toast, 這說明:廣播是可以跨進程的.

        這裏你可能會問, 明明是如何發送有序廣播的,怎麼跑題了呢?

        其實並沒有, 不信你看.

        Intent sendIntent=new Intent("com.rcd.democomponents.WHO_ARE_YOU");
        sendOrderedBroadcast(sendIntent, null);

        關鍵的地方就在於sendOrderedBroadcast()這個方法, 就收兩個參數. 第一個是Intent, 第二個是一個跟權限有關的字符串, 這裏傳入null就行了.

        再重新運行一遍的時候, 點擊按鈕, 你仍然會發現 兩個app都接收到了廣播, 這又是問什麼呢?

        都說了是有序廣播, 這個有序該怎麼設置呢, 回到AndroidManifest.xml文件中, 在的標籤中, 添加android:priority=”100” , 這保證了這個app會先於其他app先收到廣播.

        <receiver android:name="com.rcd.democomponents.DemoBroadcastReceiver">
        <intent-filter android:priority="100">
            <action android:name="com.rcd.demoscomponents.WHO_ARE_YOU"/>
        </intent-filter>
        </receiver>

        好啦, 接下來就是截斷廣播

         @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "I am thatnight", Toast.LENGTH_SHORT).show();
            abortBroadcast();
        }

        很明顯, 就一行代碼, 說明了廣播將在這裏被截斷, 不會傳播到下一個廣播接收器了.


  • 使用本地廣播,

    上面所說的發送和接收都是全局廣播, 也就是發送的廣播可以被其他任何應用程序所接收到, 這導致了一個安全性的問題.

    所以我們接下來講的是本地廣播.

    注意: 本地廣播只能通過動態註冊, 不能使用靜態註冊

    代碼如下:

     public class MainActivity extends Activity{
                private IntentFilter mIntentFilter;
    
                private DemoBroadcastRecevier mReceiver;
    
                private LocalBroadcastManager mLocalBroadcastManager;
    
                @Overrider
                protected void onCreate(Bundel savedInstance){
                    super.onCreate();
                    setContentView(R.layout.activity_main);
    
                    mIntentFilter=new IntentFilter();
                    intentFilter.addAction("com.rcd.demoscomponents.WHO_ARE_YOU");
                    mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);
                    mReceiver = new DemoBroadcastReceiver();
                    mLocalBroadcastManager.registerReceiver(mReceiver,intentFilter);
                }
    
                @Override
                protected void onDestroy(){
                    super.onDestroy();
                    mLoalBroadcastManager.unregisterReceiver(mReceiver);
                }
    
                class DemoBroadcastReceiver extends BroadcastReceiver{
    
                    @Override
                    public void onReceive(Context context, Intent intent){
                        Toast.makeText(context,"I am thatnight",Toast.LENGTH_SHOT).show();           
                    }
                }
    
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章