Android中BroadcastReceiver(異步接收廣播Intent)的使用
更新時(shí)間:2012年12月09日 18:44:50 作者:
Broadcast Receiver是Android的五大組件之一,使用頻率也很高,用于異步接收廣播Intent,本文將詳細(xì)介紹,需要的朋友可以參考下
Broadcast Receiver簡(jiǎn)介
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用于異步接收廣播Intent,廣播Intent的發(fā)送是通過(guò)調(diào)用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過(guò)調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來(lái)實(shí)現(xiàn)的。通常一個(gè)廣播Intent可以被訂閱了此Intent的多個(gè)廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似.
廣播接收器只能接收廣播,對(duì)廣播的通知做出反應(yīng),很多廣播都產(chǎn)生于系統(tǒng)代碼.如:時(shí)區(qū)改變的通知,電池電量不足、用戶改變了語(yǔ)言偏好或者開(kāi)機(jī)啟動(dòng)等.
廣播接收器沒(méi)有用戶界面,但是,它可以為它們接收到信息啟動(dòng)一個(gè)Activity或者使用NotificationManager來(lái)通知用戶.
生命周期
一個(gè)BroadcastReceiver 對(duì)象只有在被調(diào)用onReceive(Context, Intent)的才有效的,當(dāng)從該函數(shù)返回后,該對(duì)象就無(wú)效的了,結(jié)束生命周期。
因此從這個(gè)特征可以看出,在所調(diào)用的onReceive(Context, Intent)函數(shù)里,不能有過(guò)于耗時(shí)的操作,不能使用線程來(lái)執(zhí)行。對(duì)于耗時(shí)的操作,請(qǐng)start service來(lái)完成。因?yàn)楫?dāng)?shù)玫狡渌惒讲僮魉祷氐慕Y(jié)果時(shí),BroadcastReceiver 可能已經(jīng)無(wú)效了。
監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)變化的例子
下面通過(guò)一個(gè)例子來(lái)使用BroadcastReceiver。
NetworkStateReceiver:接收網(wǎng)絡(luò)狀態(tài)變化時(shí)系統(tǒng)發(fā)出的Broadcast。
package com.example.networkbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (!isNetworkAvailable(context)) {
Toast.makeText(context, "network disconnected!", 0).show();
}
else Toast.makeText(context, "network connected!", 0).show();
}
/**
* 網(wǎng)絡(luò)是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
}
MainActivity:
package com.example.networkbroadcastreceiver;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)
寫(xiě)好BroadcastReceiver 之后要對(duì)其進(jìn)行注冊(cè)。
靜態(tài)注冊(cè)需要修改manifest文件,也是我采用的方法。
添加
<SPAN style="FONT-SIZE: 14px"><receiver android:name=".NetworkStateReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver></SPAN>
動(dòng)態(tài)注冊(cè)的話需要這樣做(未調(diào)試):
1. 在Activity的onCreate中:
//注冊(cè)網(wǎng)絡(luò)監(jiān)聽(tīng)
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監(jiān)聽(tīng)
unregisterReceiver(mNetworkStateReceiver);
最終效果:
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用于異步接收廣播Intent,廣播Intent的發(fā)送是通過(guò)調(diào)用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過(guò)調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來(lái)實(shí)現(xiàn)的。通常一個(gè)廣播Intent可以被訂閱了此Intent的多個(gè)廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似.
廣播接收器只能接收廣播,對(duì)廣播的通知做出反應(yīng),很多廣播都產(chǎn)生于系統(tǒng)代碼.如:時(shí)區(qū)改變的通知,電池電量不足、用戶改變了語(yǔ)言偏好或者開(kāi)機(jī)啟動(dòng)等.
廣播接收器沒(méi)有用戶界面,但是,它可以為它們接收到信息啟動(dòng)一個(gè)Activity或者使用NotificationManager來(lái)通知用戶.
生命周期
一個(gè)BroadcastReceiver 對(duì)象只有在被調(diào)用onReceive(Context, Intent)的才有效的,當(dāng)從該函數(shù)返回后,該對(duì)象就無(wú)效的了,結(jié)束生命周期。
因此從這個(gè)特征可以看出,在所調(diào)用的onReceive(Context, Intent)函數(shù)里,不能有過(guò)于耗時(shí)的操作,不能使用線程來(lái)執(zhí)行。對(duì)于耗時(shí)的操作,請(qǐng)start service來(lái)完成。因?yàn)楫?dāng)?shù)玫狡渌惒讲僮魉祷氐慕Y(jié)果時(shí),BroadcastReceiver 可能已經(jīng)無(wú)效了。
監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)變化的例子
下面通過(guò)一個(gè)例子來(lái)使用BroadcastReceiver。
NetworkStateReceiver:接收網(wǎng)絡(luò)狀態(tài)變化時(shí)系統(tǒng)發(fā)出的Broadcast。
復(fù)制代碼 代碼如下:
package com.example.networkbroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
public class NetworkStateReceiver extends BroadcastReceiver {
private static final String TAG = "NetworkStateReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "network state changed.");
if (!isNetworkAvailable(context)) {
Toast.makeText(context, "network disconnected!", 0).show();
}
else Toast.makeText(context, "network connected!", 0).show();
}
/**
* 網(wǎng)絡(luò)是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo[] info = mgr.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
return false;
}
}
MainActivity:
復(fù)制代碼 代碼如下:
package com.example.networkbroadcastreceiver;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
靜態(tài)注冊(cè)和動(dòng)態(tài)注冊(cè)
寫(xiě)好BroadcastReceiver 之后要對(duì)其進(jìn)行注冊(cè)。
靜態(tài)注冊(cè)需要修改manifest文件,也是我采用的方法。
添加
復(fù)制代碼 代碼如下:
<SPAN style="FONT-SIZE: 14px"><receiver android:name=".NetworkStateReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver></SPAN>
動(dòng)態(tài)注冊(cè)的話需要這樣做(未調(diào)試):
1. 在Activity的onCreate中:
//注冊(cè)網(wǎng)絡(luò)監(jiān)聽(tīng)
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監(jiān)聽(tīng)
unregisterReceiver(mNetworkStateReceiver);
最終效果:
相關(guān)文章
Android控件之ProgressBar用法實(shí)例分析
這篇文章主要介紹了Android控件之ProgressBar用法,以一個(gè)完整實(shí)例形式較為詳細(xì)的分析了ProgressBar控件操作進(jìn)度顯示的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
kotlin中EditText賦值Type mismatch方式
這篇文章主要介紹了kotlin中EditText賦值Type mismatch方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Flutter組件開(kāi)發(fā)過(guò)程完整講解
這篇文章主要介紹了Flutter組件開(kāi)發(fā)過(guò)程,F(xiàn)lutter是Google開(kāi)源的構(gòu)建用戶界面(UI)工具包,幫助開(kāi)發(fā)者通過(guò)一套代碼庫(kù)高效構(gòu)建多平臺(tái)精美應(yīng)用,支持移動(dòng)、Web、桌面和嵌入式平臺(tái)。Flutter 開(kāi)源、免費(fèi),擁有寬松的開(kāi)源協(xié)議,適合商業(yè)項(xiàng)目2022-11-11
android實(shí)現(xiàn)一個(gè)圖片驗(yàn)證碼倒計(jì)時(shí)功能
本文通過(guò)實(shí)例代碼給大家介紹了android實(shí)現(xiàn)一個(gè)圖片驗(yàn)證碼倒計(jì)時(shí)功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-11-11
Android開(kāi)發(fā)中RecyclerView組件使用的一些進(jìn)階技講解
RecyclerView是Android 5.0以來(lái)新加入的一個(gè)組件,基本上全面優(yōu)于ListView,這里我們將來(lái)關(guān)注Android開(kāi)發(fā)中RecyclerView組件使用的一些進(jìn)階技講解:2016-06-06
Android手勢(shì)密碼--設(shè)置和校驗(yàn)功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android手勢(shì)密碼--設(shè)置和校驗(yàn)功能的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考校驗(yàn)價(jià)值,需要的朋友可以參考下2018-05-05
解決Android Studio導(dǎo)入項(xiàng)目非常慢的辦法
在使用Android studio的時(shí)候常常遇到這樣的問(wèn)題,從其他地方導(dǎo)入項(xiàng)目,Android studio呈現(xiàn)非常慢的現(xiàn)象!當(dāng)遇到這種情況時(shí),可以看看是下面這篇文章,再按照方法來(lái)解決!2016-09-09
android dialog邊框去除白色邊框?qū)崿F(xiàn)思路及代碼
android dialog邊框含有白色真是美中不足啊,本文將介紹如何去除白色邊框,有思路及代碼,感興趣的朋友可以了解下2013-01-01

