Android中BroadcastReceiver的使用

Broadcast Receiver简介
Broadcast Receiver是Android的五大组件之一,使用频率也很高。
用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似.
广播接收器只能接收广播,对广播的通知做出反应,很多广播都产生于系统代码.如:时区改变的通知,电池电量不足、用户改变了语言偏好或者开机启动等.
广播接收器没有用户界面,但是,它可以为它们接收到信息启动一个Activity或者使用NotificationManager来通知用户.


生命周期

    一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。

    因此从这个特征可以看出,在所调用的onReceive(Context, Intent)函数里,不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,请start service来完成。因为当得到其他异步操作所返回的结果时,BroadcastReceiver 可能已经无效了。


监听网络状态变化的例子

下面通过一个例子来使用BroadcastReceiver。

NetworkStateReceiver:接收网络状态变化时系统发出的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();     }              /**       * 网络是否可用       *        * @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);
	}  	@Override 	public boolean onCreateOptionsMenu(Menu menu) { 		getMenuInflater().inflate(R.menu.activity_main, menu); 		return true; 	} } 


静态注册和动态注册

写好BroadcastReceiver 之后要对其进行注册。
静态注册需要修改manifest文件,也是我采用的方法。

添加

<receiver android:name=".NetworkStateReceiver" >             <intent-filter>                 <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />                  <category android:name="android.intent.category.DEFAULT" />             </intent-filter>         </receiver>

动态注册的话需要这样做(未调试):

1. 在Activity的onCreate中:
//注册网络监听 
IntentFilter filter = new IntentFilter();  
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
registerReceiver(mNetworkStateReceiver, filter); 
2. 在Activity中的onDestroy中:
//取消监听
unregisterReceiver(mNetworkStateReceiver); 

最终效果:



参考:

 

基础总结篇之五:BroadcastReceiver应用详解-http://blog.csdn.net/liuhe688/article/details/6955668


你可能感兴趣的:(Android中BroadcastReceiver的使用)