一.广播概述:
发送广播使用Intent。而接收广播的方法则需要广播接收器(Broadcast Receiver)。
Android 中的广播主要可以分为两种类型,标准广播和有序广播。
标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的
广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可
言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播:是一个一个接收的 不是在同一时刻 是有顺序的 因此 这种广播是可以被截断的.
注册广播的方式一般有两种,在代
码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态
注册。
二.接收广播实例
那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,
并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,
具体的逻辑就可以在这个方法中处理。
动态注册:
public class IndexActivity extends Activity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);//动态注册广播 在destory方法 一定要取消注册
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "network is available",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "network is unavailable",
Toast.LENGTH_SHORT).show();
}
}
}
另外,这里有非常重要的一点需要说明,Android 系统为了保证应用程序的安全性做了
规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则
程序将会直接崩溃, 比如这里查询系统的网络状态就是需要声明权限的。
查询网络权限:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
静态注册:
动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是
它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在
onCreate()方法中的。
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
可以看到,这里不再使用内部类的方式来定义广播接收器,因为稍后我们需要在
AndroidManifest.xml 中将这个广播接收器的类名注册进去
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广
播,因此我们在这里添加了相应的action。
另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>
标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限。