Android四大組件之BroadcastReceiver-創(chuàng)新互聯(lián)

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

目前創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、柏鄉(xiāng)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

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

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

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

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

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

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

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

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

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

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

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

5、廣播的生命周期

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

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

下面通過代碼來實(shí)現(xiàn)廣播的注冊與發(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è)廣播接收器可以接收來自四面八方發(fā)出的消息,所以可以在onReceive中通過intent.getAction判斷接收到的action來進(jìn)行不同的操作,action為系統(tǒng)的action或者我們自定義的action

然后需要注冊廣播了,有兩種注冊方式

靜態(tài)注冊

 <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)注冊廣播 -->
        <receiver android:name=".MyReceiver" >
            <intent-filter>
                <action android:name="com.action.text" /> //自定義的action,為一個(gè)字符串
            </intent-filter>
        </receiver>
    </application>

動態(tài)注冊:

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

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

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

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

	@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ù)傳遞,可以通過intent來傳遞

無序廣播:

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

有序廣播

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

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

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

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", "來自第一個(gè)廣播接收器的消息");
			setResultExtras(bundle); //將一個(gè)Bundle對象設(shè)置為結(jié)果集對象,傳遞到下一個(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)過處理的信息
			Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
		}
	}
}

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

        <receiver 
            android:name=".FirstReceiver">
            <intent-filter 
                android:priority="1000">  //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級越高
                <action android:name="com.action.text"/>
            </intent-filter>
        </receiver>
        <receiver 
            android:name=".FirstReceiver">
            <intent-filter 
                android:priority="1000">  //這個(gè)屬性的范圍在-1000到1000,數(shù)值越大,優(yōu)先級越高
                <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", "來自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)先級最高的接收器就會先接收到廣播,然后再依次傳遞給優(yōu)先級較低的接收器

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

abortBroadcast();

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)頁題目:Android四大組件之BroadcastReceiver-創(chuàng)新互聯(lián)
當(dāng)前地址:http://muchs.cn/article8/ddsdop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、企業(yè)網(wǎng)站制作、面包屑導(dǎo)航App設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)