溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android四大組件之BroadcastReceiver

發(fā)布時(shí)間:2020-06-01 20:25:03 來(lái)源:網(wǎng)絡(luò) 閱讀:504 作者:joyy001 欄目:移動(dòng)開發(fā)


BroadcastReceiver:廣播接收器,是一個(gè)專注于接收廣播通知信息,并做出對(duì)應(yīng)處理的組件

1、應(yīng)用程序可以擁有任意數(shù)量的廣播接收器以對(duì)所有它感興趣的通知信息予以響應(yīng)。所有的接收器均繼承自BroadcastReceiver基類

 2、廣播接收器沒(méi)有用戶界面。然而,它們可以啟動(dòng)一個(gè)activity來(lái)響應(yīng)它們收到的信息,或者用NotificationManager來(lái)通知用戶。通知可以用很多種方式來(lái)吸引用戶的注意力──閃動(dòng)背燈、震動(dòng)、播放聲音等等。一般來(lái)說(shuō)是在狀態(tài)欄上放一個(gè)持久的圖標(biāo),用戶可以打開它并獲取消息

 3、 Android中的廣播事件有兩種:

1)系統(tǒng)廣播事件,比如:ACTION_BOOT_COMPLETED(系統(tǒng)啟動(dòng)完成后觸發(fā)),ACTION_TIME_CHANGED(系統(tǒng)時(shí)間改變時(shí)觸發(fā)),ACTION_BATTERY_LOW(電量低時(shí)觸發(fā))等等2)我們自定義的廣播事件。

 

4、 廣播時(shí)間流程:

1)注冊(cè)廣播事件:注冊(cè)方式有兩種,

一種是靜態(tài)注冊(cè),就是在AndroidManifest.xml文件中定義,注冊(cè)的廣播接收器必須要繼承BroadcastReceiver;靜態(tài)注冊(cè)的廣播,在程序結(jié)束時(shí),仍會(huì)監(jiān)聽符合的action

 另一種是動(dòng)態(tài)注冊(cè),是在程序中使用Context.registerReceiver注冊(cè),注冊(cè)的廣播接收器相當(dāng)于一個(gè)匿名類。兩種方式都需要IntentFIlter。

2)發(fā)送廣播事件:通過(guò)Context.sendBroadcast來(lái)發(fā)送,由Intent來(lái)傳遞注冊(cè)時(shí)用到的Action。

 3)接收廣播事件:當(dāng)發(fā)送的廣播被接收器監(jiān)聽到后,會(huì)調(diào)用它的onReceive()方法,并將包含消息的Intent對(duì)象傳給它。

 注意:onReceive中代碼的執(zhí)行時(shí)間不要超過(guò)5s,否則Android會(huì)彈出超時(shí)dialog。


5、廣播的生命周期

 一個(gè)BroadcastReceiver 對(duì)象只有在被調(diào)用onReceive(Context, Intent)的才有效的,

  當(dāng)從該函數(shù)返回后,該對(duì)象就無(wú)效的了,結(jié)束生命周期


下面通過(guò)代碼來(lái)實(shí)現(xiàn)廣播的注冊(cè)與發(fā)送、接收廣播

首先定義一個(gè)廣播接收器,創(chuàng)建一個(gè)類(MyReceiver)繼承BroadcastReceiver,實(shí)現(xiàn)其onReceive()方法

package com.BroadcastReceive.Archer;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (action.equals("com.action.text")) {
			String msg = intent.getStringExtra("msg");
			Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
		}
	}
}

一個(gè)廣播接收器可以接收來(lái)自四面八方發(fā)出的消息,所以可以在onReceive中通過(guò)intent.getAction判斷接收到的action來(lái)進(jìn)行不同的操作,action為系統(tǒng)的action或者我們自定義的action


然后需要注冊(cè)廣播了,有兩種注冊(cè)方式

靜態(tài)注冊(cè)

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 靜態(tài)注冊(cè)廣播 -->
        <receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="com.action.text" /> //自定義的action,為一個(gè)字符串
            </intent-filter>
        </receiver>
    </application>


動(dòng)態(tài)注冊(cè):

private MyReceiver receiver = new MyReceiver(); //實(shí)例化廣播接收器
    	//動(dòng)態(tài)注冊(cè)廣播
    	IntentFilter filter = new IntentFilter();
    	filter.addAction("com.action.text");
    	registerReceiver(receiver, filter);

在Activity或Service中注冊(cè)了一個(gè)BroadcastReceiver(動(dòng)態(tài)注冊(cè)),

當(dāng)這個(gè)Activity或Service被銷毀時(shí)如果沒(méi)有解除注冊(cè),系統(tǒng)會(huì)報(bào)一個(gè)異常

我們可以在onStop()或者onDestroy()中進(jìn)行解除注冊(cè)

	@Override  
	protected void onDestroy() {  
	    super.onDestroy();  
	    unregisterReceiver(receiver);  
	}


發(fā)送廣播

Intent intent = new Intent();
				intent.setAction("com.action.text");//為廣播時(shí)間設(shè)置action
				intent.putExtra("msg", "接收廣播成功");
				sendBroadcast(intent);

如果我們需要在發(fā)送廣播的同時(shí),進(jìn)行數(shù)據(jù)傳遞,可以通過(guò)intent來(lái)傳遞


無(wú)序廣播:

當(dāng)發(fā)出廣播時(shí),所有有注冊(cè)這個(gè)action的廣播接收器均會(huì)接收到這個(gè)廣播事件,且執(zhí)行無(wú)先后順序,相互之間不會(huì)有影響;沒(méi)有注冊(cè)則不會(huì)接收到


有序廣播

當(dāng)有多一個(gè)廣播接收器注冊(cè)這個(gè)action,且我們需要給他們?cè)O(shè)置接收的順序時(shí),這時(shí)候就要用到有序廣播。

有序廣播比較特殊,它每次只發(fā)送到優(yōu)先級(jí)較高的接收器那里,然后由優(yōu)先級(jí)高的接收器再傳播到優(yōu)先級(jí)低的接收器那里,優(yōu)先級(jí)高的接收者有能力終止這個(gè)廣播。

先定義兩個(gè)廣播接收器,F(xiàn)irstReceiver為優(yōu)先級(jí)較高的接收器

public class FirstReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (action.equals("action")) {
			String msg = intent.getStringExtra("msg");
			Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();

			Bundle bundle = new Bundle();
			bundle.putString("msg", "來(lái)自第一個(gè)廣播接收器的消息");
			setResultExtras(bundle); //將一個(gè)Bundle對(duì)象設(shè)置為結(jié)果集對(duì)象,傳遞到下一個(gè)接收者那里
		}
	}
}
public class SecondReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String action = intent.getAction();
		if (action.equals("action")) {
			String msg = getResultExtras(true).getString("msg"); //用getResultExtras獲取到經(jīng)過(guò)處理的信息
			Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
		}
	}
}

注冊(cè)廣播時(shí),需要給設(shè)置優(yōu)先級(jí) android:priority

        <receiver 
            android:name=".FirstReceiver">
            <intent-filter 
                android:priority="1000">  //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級(jí)越高
                <action android:name="com.action.text"/>
            </intent-filter>
        </receiver>
        <receiver 
            android:name=".FirstReceiver">
            <intent-filter 
                android:priority="1000">  //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級(jí)越高
                <action android:name="com.action.text"/>
            </intent-filter>
        </receiver>
        <receiver 
            android:name=".SecondReceiver">
            <intent-filter 
                android:priority="999">
                <action android:name="com.action.text"/>
            </intent-filter>
        </receiver>

發(fā)送有序廣播

Intent intent = new Intent();  
intent.setAction("com.action.text");
    intent.putExtra("msg", "來(lái)自Activity的消息");  
    sendOrderedBroadcast(intent, "scott.permission.MYBROADCAST");
使用發(fā)送有序廣播,第二個(gè)參數(shù)為自定義權(quán)限,為null時(shí),表示不需要聲明指定權(quán)限;不為空,表示需要聲明指定權(quán)限,聲明如下權(quán)限
<permission android:protectionLevel="normal"  
            android:name="scott.permission.MYBROADCAST" />
            <uses-permission android:name="scott.permission.MYBROADCAST" />

這有發(fā)出廣播時(shí),優(yōu)先級(jí)最高的接收器就會(huì)先接收到廣播,然后再依次傳遞給優(yōu)先級(jí)較低的接收器

如果我們需要在某一個(gè)接收器中終止廣播,可以在onReceiver()中調(diào)用如下代碼

abortBroadcast();


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI