Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 四大組件之BroadcastReceiver(一)-自定義“收音機”與發送“廣播”

四大組件之BroadcastReceiver(一)-自定義“收音機”與發送“廣播”

編輯:關於Android編程

第1節 Broadcast Receiver概述

很多時候,我們希望一個應用程序在它沒有運行起來的時候,也能感知系統狀態的某些變化,如果條件合適,就讓這個應用就運行起來。

比如,一個攔截騷擾電話的應用,平時它可能並不需要運行起來,它只關心有電話來的時候,看看這個號碼是不是騷擾電話的號碼,如果是就給用戶發出一個提示,如果不是,那就和它沒有關系,啥也不做。

為了實現這類功能,安卓系統引入了四大組件之一的BroadcastReceiver,設計了一套廣播與接收的機制,

任何應用或者安卓系統的自身組件可以像發送無線電波一樣,向系統發出一條廣播信息Broadcast; 信息在系統中按照一定的規則傳播(傳播的規則稍後會詳細介紹); 任何應用或者安卓系統的自身組件都擁有一台接收機Broadcast Receiver,這台接收機會告訴安卓系統,它能接收某種特定的廣播; 如果安卓系統辨別出當前系統中傳播的廣播,正是某台接收機關注的廣播,那麼它就會把接收機運行起來,讓接收機決定下一步怎麼做?是讓接收機運行別的組件(Service或者Activity)繼續進一步的響應,還是忽略這條廣播。 \

第2節 自定義Broadcast Receiver

無論是應用還是系統組件,它們定義Broadcast Receiver的方式都是一樣。

定義Broadcast Receiver有兩種方式,

靜態定義:將Broadcast Receiver聲明到AndroidManifest.xml配置文件當中,它的特點是應用不必運行起來,系統能通過配置文件的描述判斷當前系統中的廣播是否是這台接收機關注的;

動態定義:在代碼中動態生成Broadcast Receiver,它的特點是應用要運行起來,在運行的過程當中判斷當前系統中的廣播是否是這台接收機關注的;

2.1 靜態Broadcast Receiver

首先來看看如何定義一個靜態的Broadcast Receiver

繼承BroadcastReceiver類,實現它的onReceive接口,

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    //實現onReceive接口,當收到指定的廣播後被觸發
    @Override
    public void onReceive(Context context, Intent intent) {

        //添加對應的邏輯處理
    }
}

AndroidManifest.xml配置文件當中,聲明創建的Broadcast Receiver


    
         ---指定關注的廣播
        
    

這裡intent-filter標簽中的android:name屬性設置的值custom.action.mybroadcast,就是這台接收機關注的廣播。

當名稱為custom.action.mybroadcast的廣播在系統中傳播的時候,MyReceiver就會被運行起來,並觸發它的onReceive()函數。開發者就需要在這裡添加對應邏輯處理。

2.2 動態Broadcast Receiver

當應用運行起來以後,即使AndroidManifest.xml文件中沒有聲明過Broadcast Receiver也沒有關系,它可以被動態的創建,

和創建靜態Broadcast Receiver類似,首先要繼承BroadcastReceiver類,實現它的onReceive接口,

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    //實現onReceive接口,當收到指定的廣播後被觸發
    @Override
    public void onReceive(Context context, Intent intent) {

        //添加對應的邏輯處理
    }
}

注冊Broadcast Receiver,並告訴系統這個Broadcast Receiver關注哪些廣播,可以添加多種關心的廣播,

//設置過濾器,確定關心的廣播
IntentFilter filter = new IntentFilter();
filter.addAction("custom.action.mybroadcast");
//可以添加多種關心的廣播
filter.addAction(......);

//創建Receiver
MyReceiver receiver = new MyReceiver();

//注冊到系統當中,完成Receiver的設置
registerReceiver(receiver, filter);

使用完畢後,一定要注銷Broadcast Receiver,否則系統會給出警告提示。

unregisterReceiver(receiver);

動態的Broadcast Receiver在注冊使用完成之後一定要注銷,不然會占用系統資源、浪費資源。


/*******************************************************************/
* 版權聲明
* 本教程只在CSDN和安豆網發布,其他網站出現本教程均屬侵權。
/*******************************************************************/


第3節 發送Broadcast

任何應用或者安卓系統的自身組件可以向系統發出廣播信息Broadcast,只要使用ContextsendBroadcast()方法就可以了,

unregisterReceiver(receiver);
Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);

發送出去的廣播可以分成兩類,一類是無序廣播,一類是有序廣播。

3.1 無序廣播

這是一種不需要考慮接收者接收順序的廣播,比如說有3個接收機,都關注custom.action.mybroadcast這種廣播,無所謂誰先收到誰後收到。接收機不能阻止其它接收機獲取到這條廣播。

\

3.1.1 發送

發送無序廣播,只要使用ContextsendBroadcast()方法就可以了,

Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);

3.1.2 接收

AndroidManifest.xml中聲明靜態Broadcast Receiver的時候,


   
       
       
   

就像前面介紹的那樣,不用做什麼特別的處理。

3.2 有序廣播

這是一種需要考慮接收者接收順序的廣播,比如說有3個接收機,都關注custom.action.mybroadcast這種廣播,那麼安卓系統將根據這3個接收機聲明的優先級進行廣播的投遞。

而且有序廣播是可以被阻截的。

比如,一個廣播按照順序傳遞給3個接收機-A B C,但是B將廣播攔截了,因此C將不會收到這個廣播。

\

3.2.1 發送

Intent i = new Intent("custom.action.mybroadcast");
sendOrderedBroadcast(i, null);

3.2.1 接收

接收的時候,需要給intent-filter標簽設置android:priority屬性,表示這個接收機的優先級。優先級從-1000到1000,數值越大,優先級越高。


   
       
       
   

接收到廣播以後,Broadcast Receiver可以將廣播攔截,禁止它往下傳播,

public class MyReceiver extends BroadcastReceiver {
   public MyReceiver() {
   }

   //實現onReceive接口
   @Override
   public void onReceive(Context context, Intent intent) {

       //禁止往下傳播
       abortBroadcast();
   }
}

如果接收機1onReceive()中,希望把數據傳遞給下個接收機2

接收機1可以使用setResultExtras()方法,

public class MyReceiver1 extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle b = new Bundle();
        b.putString("data", "this data from MyReceiver");
        setResultExtras(b);
    }
}

接收機2中,

public class MyReceiver2 extends BroadcastReceiver {
    public MyReceiver2() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle b = getResultExtras(true);
        if(b!=null)
        {
            //data就是前一個接收機1傳來的-this data from MyReceiver
            String data = b.getString("data");

        }

    }
}

假如希望將數據放到onReceive()傳入的Intent當中,是不會傳遞成功的,

@Override
public void onReceive(Context context, Intent intent) {

    //這是不會成功的
    intent.putExtra("data", "this data from MyReceiver");

}

傳遞數據,一定要通過BroadcastReceiver提供的setResultExtras()方法。

另外,測試發現,只要不在有序廣播之間傳遞數據,使用sendBroadcast()方法,也能成功發出有序廣播。

Intent i = new Intent("custom.action.mybroadcast");
sendBroadcast(i);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved