Android中BroadcastReceiver(異步接收廣播Intent)的使用
更新時間:2012年12月09日 18:44:50 作者:
Broadcast Receiver是Android的五大組件之一,使用頻率也很高,用于異步接收廣播Intent,本文將詳細(xì)介紹,需要的朋友可以參考下
Broadcast Receiver簡介
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現(xiàn)的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似.
廣播接收器只能接收廣播,對廣播的通知做出反應(yīng),很多廣播都產(chǎn)生于系統(tǒng)代碼.如:時區(qū)改變的通知,電池電量不足、用戶改變了語言偏好或者開機(jī)啟動等.
廣播接收器沒有用戶界面,但是,它可以為它們接收到信息啟動一個Activity或者使用NotificationManager來通知用戶.
生命周期
一個BroadcastReceiver 對象只有在被調(diào)用onReceive(Context, Intent)的才有效的,當(dāng)從該函數(shù)返回后,該對象就無效的了,結(jié)束生命周期。
因此從這個特征可以看出,在所調(diào)用的onReceive(Context, Intent)函數(shù)里,不能有過于耗時的操作,不能使用線程來執(zhí)行。對于耗時的操作,請start service來完成。因為當(dāng)?shù)玫狡渌惒讲僮魉祷氐慕Y(jié)果時,BroadcastReceiver 可能已經(jīng)無效了。
監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化的例子
下面通過一個例子來使用BroadcastReceiver。
NetworkStateReceiver:接收網(wǎng)絡(luò)狀態(tài)變化時系統(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)注冊和動態(tài)注冊
寫好BroadcastReceiver 之后要對其進(jìn)行注冊。
靜態(tài)注冊需要修改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>
動態(tài)注冊的話需要這樣做(未調(diào)試):
1. 在Activity的onCreate中:
//注冊網(wǎng)絡(luò)監(jiān)聽
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監(jiān)聽
unregisterReceiver(mNetworkStateReceiver);
最終效果:
Broadcast Receiver是Android的五大組件之一,使用頻率也很高。
用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、廣播接收者(BroadcastReceiver)用于異步接收廣播Intent,廣播Intent的發(fā)送是通過調(diào)用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()來實現(xiàn)的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收,廣播接收者和JMS中的Topic消息接收者很相似.
廣播接收器只能接收廣播,對廣播的通知做出反應(yīng),很多廣播都產(chǎn)生于系統(tǒng)代碼.如:時區(qū)改變的通知,電池電量不足、用戶改變了語言偏好或者開機(jī)啟動等.
廣播接收器沒有用戶界面,但是,它可以為它們接收到信息啟動一個Activity或者使用NotificationManager來通知用戶.
生命周期
一個BroadcastReceiver 對象只有在被調(diào)用onReceive(Context, Intent)的才有效的,當(dāng)從該函數(shù)返回后,該對象就無效的了,結(jié)束生命周期。
因此從這個特征可以看出,在所調(diào)用的onReceive(Context, Intent)函數(shù)里,不能有過于耗時的操作,不能使用線程來執(zhí)行。對于耗時的操作,請start service來完成。因為當(dāng)?shù)玫狡渌惒讲僮魉祷氐慕Y(jié)果時,BroadcastReceiver 可能已經(jīng)無效了。
監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化的例子
下面通過一個例子來使用BroadcastReceiver。
NetworkStateReceiver:接收網(wǎng)絡(luò)狀態(tài)變化時系統(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)注冊和動態(tài)注冊
寫好BroadcastReceiver 之后要對其進(jìn)行注冊。
靜態(tài)注冊需要修改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>
動態(tài)注冊的話需要這樣做(未調(diào)試):
1. 在Activity的onCreate中:
//注冊網(wǎng)絡(luò)監(jiān)聽
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver, filter);
2. 在Activity中的onDestroy中:
//取消監(jiān)聽
unregisterReceiver(mNetworkStateReceiver);
最終效果:

相關(guān)文章
Android基于方法池與回調(diào)實現(xiàn)登錄攔截的場景
這篇文章主要為大家介紹了Android基于方法池與回調(diào)實現(xiàn)登錄攔截的場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android 獲取正在運(yùn)行的任務(wù)和服務(wù)的小例子
Android 獲取正在運(yùn)行的任務(wù)和服務(wù)的小例子,需要的朋友可以參考一下2013-05-05Flutter Recovering Stream Errors小技巧
這篇文章主要為大家介紹了Flutter Recovering Stream Errors小技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Kotlin中內(nèi)置函數(shù)的用法和區(qū)別總結(jié)
眾所周知相比Java, Kotlin提供了不少高級語法特性。對于一個Kotlin的初學(xué)者來說經(jīng)常會寫出一些不夠優(yōu)雅的代碼。下面這篇文章主要給大家介紹了關(guān)于Kotlin中內(nèi)置函數(shù)的用法和區(qū)別的相關(guān)資料,需要的朋友可以參考下2018-06-06Android音頻處理之通過AudioRecord去保存PCM文件進(jìn)行錄制,播放,停止,刪除功能
這篇文章主要介紹了Android音頻處理之通過AudioRecord去保存PCM文件進(jìn)行錄制,播放,停止,刪除功能的相關(guān)資料,需要的朋友可以參考下2016-11-11Android登錄注冊功能 數(shù)據(jù)庫SQLite驗證
這篇文章主要為大家詳細(xì)介紹了Android登錄注冊功能,數(shù)據(jù)庫SQLite驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Kotlin高階函數(shù)reduce與fold使用實例
Kotlin的高階函數(shù)reduce和fold可以用來對集合進(jìn)行聚合操作。reduce函數(shù)將集合元素逐個累加,而fold函數(shù)則可以指定一個初始值進(jìn)行累加。這兩個函數(shù)在處理大數(shù)據(jù)集時非常有用2023-04-04