Android四大組件之BroadcastReceiver

來源:互聯網
上載者:User

標籤:cat   好的   接受   無法   進程   沒有   自己的   onpause   過濾   

什麼是BroadcastReceiver?

      BroadcastReceiver(廣播接收器),顧名思義,是用來接收廣播的。Android內部實現了一套廣播通訊機制,即在某個應用或某個組件註冊廣播接收器,接收特定類型的廣播。當別的應用或組件發送該類型的廣播時,註冊廣播接收器的組件或應用就能接收到該廣播,並執行相應的操作,這非常類似於觀察者模式。

 

如何使用BroadcastReceiver?

      BroadcastReceiver使用起來非常簡單,我們只需要先自訂一個廣播接收器,然後在想要接收廣播的組件中註冊該廣播接收器。當別的組件發送廣播的時候,廣播接收器就能收到該廣播,然後執行相應的操作就可以了。下面將一步步介紹廣播接收器的具體使用方法。

1.自訂廣播接收器:

      自訂廣播接收器的方法很簡單,我們只需要建立一個自訂類繼承BroadcastReceiver,並實現onReceive()方法

public class MyBroadcastReceiver extends BroadcastReceiver {    //需要實現的方法    @Override    public void onReceive(Context context, Intent intent) {    }}

      onReceive()方法就是當廣播接收器接收到廣播後會執行的方法,我們可以看到它會接收到一個Intent,這個Intent就是發送廣播時傳過來的Intent對象,我們可以在onReceive()中擷取Intent傳來的額外資料,並進行處理。

2.註冊廣播接收器

      建立了自己的廣播接收器後,我們就可以在需要接收廣播的地方進行註冊。註冊廣播的方式有兩種:靜態註冊和動態註冊。

      靜態註冊廣播需要我們在AndroidManifest中去註冊廣播接收器,它的特點是該廣播接收器一旦註冊後將會一直存在,並且監聽廣播,即使我們退出了應用,廣播接收器仍然可以接收廣播,並觸發onReceive()方法。靜態廣播的使用也比較廣泛,比如一個公司裡有多個App產品,通過靜態註冊的廣播接收器,就能夠實現一個App啟動其他的App。

    <application>             ...        <receiver android:name=".widget.MyBroadcastReceiver">            <intent-filter>                <action android:name="com.weimore.example.MY_BROADCAST"/>            </intent-filter>        </receiver>          ...    <application/>

      如上,我們註冊廣播接收器,首先指定是哪一個廣播接收器,在receiver標籤寫上我們之前自訂的廣播接收器的類名即可。然後在裡面添加一個intent-filter(過濾器)用來過濾廣播,intent-filter裡的action指定了我們所要接收的廣播,如果對intent-filter不瞭解的,可以去看看我寫的關於intent的一篇部落格。當其他地方發出廣播時,我們會對比其傳遞的intent中的action,如果intent中的action與註冊廣播接收器時intent-filter中指定的action一致,則接收此廣播,這樣就起到了廣播過濾的作用。

      動態註冊廣播和靜態註冊一樣,需要知道使用的廣播接收器,以及需要一個Intent-filter用來過濾廣播,Intent-filter中同樣需要傳入一個action,用來指定要接收的廣播,最後使用registerReceiver()註冊廣播即可。代碼如下:

   //自訂的廣播接收器
MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); //過濾器,其中傳入一個action
IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST"); //註冊廣播
registerReceiver(mReceiver,filter);

       解註冊廣播:

   //解註冊
unregisterReceiver(mReceiver);

      我們用Activity動態註冊和解註冊BraodcastReceiver時,最好在onResume()方法和onPause()方法中進行註冊和解註冊。因為不處於互動狀態的Activity本來就沒有必要去接受和處理廣播。

      這樣廣播接收器就算是註冊完成了,接下來只要等待其他應用或組件發送廣播。然後進行接收就可以了。發送廣播的方法也很簡單,通過調用sendBroadcast()方法,並傳入一個 intent 即可。

  //建立Intent對象  Intent intent = new Intent();  //指定action  intent.setAction("com.weimore.example.MY_BROADCAST");  //發送廣播  sendBroadcast(intent);

      廣播發送後,我們註冊的廣播接收器就能接收到廣播,並調用接收器中的onReceive()方法,整個廣播的發送與接收流程也就完成了。要注意的是,靜態註冊廣播接收器的特點是即使應用銷毀後也會接收廣播,而動態註冊廣播接收器則相反,它的生命週期十分短暫,大概在10秒左右。每次當有匹配的廣播發送過來時,它會建立BroadcastReceiver,並執行裡面的onReceive()方法,然後10秒左右就會被銷毀,所以我們在onReceive()方法種盡量不要進行太長的耗時操作。此外,我們也最好不要再BroadcastReceiver中建立子線程進行耗時操作,因為BroadcastReceiver在執行onReceive()結束任務後,它的進程優先順序會處於空進程的優先順序,隨時隨地會被系統給回收銷毀,而依賴於該進程的子線程也會隨即被銷毀。所以最好的處理方法是在onReceive()中啟動Service,將耗時操作交給Service去處理。

 

其他的Broadcast

      上面所介紹的廣播屬於標準廣播,該種廣播一旦發送,只要是action能夠匹配的BroadcastReceiver都能夠接收到廣播。除了該類型的廣播之外,我們還能夠發送有序廣播,本地廣播等。

      有序廣播是指當廣播發送後,會根據廣播接收器的優先順序進行順序傳遞。比如有兩個廣播接收器都能夠匹配該廣播,但一個的優先順序為100,而另外一個的優先順序為50,則廣播為先傳遞到優先順序高的那個廣播接收器,該廣播接收器接收到廣播後,可以對廣播進行攔截,這樣後面的廣播接收器就無法接收到該廣播了,如果不做攔截,則會繼續按優先順序大小發送廣播。

      有序廣播的使用也很簡單,將之前的sendBroadcast()方法變為sendOrderedBroadcast()就可以了。

//第二個參數表示接收器接收該廣播所需要的許可權,一般傳null即可sendOrderedBroadcast(intent,null);

      設定廣播接收器的優先順序主要是在Intent-filter中設定的。靜態註冊和動態註冊給廣播接收器設定優先權的方法分別如下:

   //靜態註冊
<receiver android:name=".widget.MyBroadcastReceiver"> <intent-filter android:priority="100"> //設定優先權 <action android:name="com.weimore.example.MY_BROADCAST"/> </intent-filter> </receiver>
   //動態註冊   
IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST"); filter.setPriority(100);

      如果某個廣播接收器想要攔截該廣播,只需要在onReceive()方法中調用abortBroadcast()方法就可以了。

@Override    public void onReceive(Context context, Intent intent) {        //攔截廣播        abortBroadcast();    }

     

      本地廣播和標準廣播以及有序廣播有些許不同,它是使用LocalBroadcastManager來發送廣播以及註冊廣播接收器的。本地廣播的優點是它發出的廣播只會在應用程式的內部傳播,不用擔心廣播被其他應用接收,造成資料泄漏,而廣播接收器也只能接收到自己應用發出的廣播,不會接收別的應用發來的廣播,防止接收垃圾資訊。具體使用如下:

    //得到LocalBroadcastManager執行個體    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);    mReceiver = new MyBroadcastReceiver();    IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");    //註冊廣播接收器    manager.registerReceiver(mReceiver,filter);
    //得到LocalBroadcastManager執行個體    LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);    Intent intent = new Intent();    intent.setAction("com.weimore.example.MY_BROADCAST");    //發送本地廣播    manager.sendBroadcast(intent);

      

 

Android四大組件之BroadcastReceiver

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.