Android-BroadcastReceiver

Broadcast(廣播)是Android四大組件之一,正如其名,就像一個廣播喇叭一樣,起著進程間,或進程內(nèi)部傳遞消息的作用。

BroadcastReceiver(廣播接收器)有兩種生成方式,靜態(tài)注冊和動態(tài)注冊,靜態(tài)注冊就是在xml中注冊,動態(tài)注冊就是在activity中注冊,

BroadcastReceiver有兩種范圍,一種是進程間,如android很多內(nèi)置的系統(tǒng)級廣播,可以在系統(tǒng)的各個位置任意時段接受,另一種是本地廣播,只能作用于某一個應(yīng)用程序內(nèi)部,一般我們用這種即可,以免導致一些不必要的凌亂。

BroadcastReceiver有兩個類別,一個標準廣播,速度快,所有接收器幾乎同時接收而沒有順序。另一種是有序廣播,可以有序的接收,并攔截。

下面我們分類探討一下。

在接收廣播前,很顯然要先生成一條廣播:

IntentFilter mIntentFilter = new IntentFilter();

mIntentFilter.addAction(“android.net.conn.CONNECTIVITY_CHANGE”);

registerReceiver(mReceiver,mIntent);

這里新建了一個IntentFilter,addAction接收的參數(shù)就是具體要監(jiān)聽的廣播,緊接著注冊這個接收器。

在這個Activity的onDestroy()方法中:

unregisterReceiver(mReceiver);

銷毀接收器

在這里新建一個類并繼承BroadcastReceiver(廣播接收器),并重寫onReceiver()方法

classNetworkChangeReceiverextendsBroadcastReceiver{

@Override

public voidonReceive(Context context,Intent intent) {

Toast.makeText(context,"network

changes",Toast.LENGTH_SHORT).show();

}

}

這里在activity中寫了一個內(nèi)部類,繼承BroadcastReceiver,在onReceive()方法中寫具體邏輯,這里只打印一個吐司。

注意,這里實際上就是一個動態(tài)的在activity中注冊一個廣播接收器。

靜態(tài)注冊。

動態(tài)注冊很顯然只有你程序啟動以后才能使用,因為注冊是寫在onCreate()中的,靜態(tài)注冊就可以各個時段使用。

首先,和動態(tài)注冊差不多的一件事,就是新建一個類,繼承BroadcastReceiver并重寫onReceiver()方法。

public classBootCompleteReceiverextendsBroadcastReceiver {

public voidonReceive(Context context,Intent intent){

Toast.makeText(context,"BootComplete",Toast.LENGTH_SHORT).show();

}

}

這是一個監(jiān)聽開機啟動的一個廣播接收器,我們在AndroidManifest.xml文件中,聲明一個監(jiān)聽開機啟動的intentFilter

在標簽內(nèi)寫入:

這實際上就是,xml版的IntentFilter

接著,action這里的值是"android.intent.action.BOOT_COMPLETED",這里監(jiān)聽了系統(tǒng)開機,這種系統(tǒng)級信息的監(jiān)聽或服務(wù)都是需要聲明權(quán)限的,所以,在最開始我們就寫入:

自定義廣播

關(guān)鍵在于監(jiān)聽的action的值,兩邊不寫錯即可,其他的都差不多

有序廣播

之前寫的都是標準廣播,是沒有接收順序,也不能攔截的,有序廣播與此不同。

發(fā)送有序廣播和標準廣播的操作大體不差,首先要有廣播,這里就直接定義一個接收器,然后在AndroidMainfest.xml中注冊一個自定義廣播:

public classAnotherBroadcastReceiverextendsBroadcastReceiver {

@Override

public voidonReceive(Context context,Intent intent) {

Toast.makeText(context,"received in AnotherBroadcastReceiver",Toast.LENGTH_SHORT).show();

abortBroadcast();

}

}

>

然后再某一個activity中:

IntentmIntent =newIntent("com.example.broadcasttest.MY_BROADCAST");

sendOrderedBroadcast(mIntent, null);

可見,唯一的區(qū)別就是調(diào)用的時候,方法變了,還有注冊的時候多了一個android:priority

屬性,這個屬性的值越大,優(yōu)先級越高,越先收到廣播

abortBroadcast();

方法用來攔截廣播,禁止繼續(xù)傳遞。

本地廣播

以上,都是全局廣播,也就是說所有的程序都有可能受到,自然是有很大隱患的。所以一般我們用本地廣播

本地廣播的初始化方式也很想,無非就是類不一樣:

privateIntentFilterintentFilter;

privateLocalBroadcastManagermanager; //管理本地廣播

LocalBroadcastReceiver localBroadcastReceiver =newLocalBroadcastReceiver();

manager= LocalBroadcastManager.getInstance(this);//獲取實例

manager.sendBroadcast(mIntent);

intentFilter=newIntentFilter();

intentFilter.addAction(" ...... ");

manager.registerReceiver(localBroadcastReceiver,intentFilter);

在onCreate()方法中,首先new一個IntentFilter,receiver,然后拿到manager的實例,調(diào)用localBroadcastReceiver.registerReceiver()注冊,這樣,就是注冊了一個本地廣播接收器,不要忘了在onDestroy()中釋放就好。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 寫作背景:最近在做視頻播放器,客戶提出兩項新需求: 插耳機看視頻,拔出耳機,視頻需要暫停。 視頻播放時,按耳機按鈕...
    Big不吃魚閱讀 8,281評論 5 17
  • 描述 在 Android 系統(tǒng)中,廣播(Broadcast)是在組件之間傳播數(shù)據(jù)的一種機制,這些組件可以位于不同的...
    pkqgo閱讀 1,679評論 1 2
  • BroadcastReceiver BroadcastReceiver,廣播接收者,用來接收系統(tǒng)和應(yīng)用的廣播,并做...
    AshengTan閱讀 2,278評論 1 8
  • 今夜?jié)M天烏云 所有的星星都被遮蔽 只有月亮還孤獨的望著我
    鯊魚有角閱讀 263評論 0 0
  • 這是一部11年的電影,昨晚看了電影公眾號的推薦發(fā)現(xiàn)的一部有意思的電影,是我感興趣的穿越時間題材的電影。講述的是,原...
    _亦言閱讀 310評論 0 0

友情鏈接更多精彩內(nèi)容