BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件。广播分为两种:标准广播和有序广播。
标准广播: 是一种完全异步执行的广播,广播发出之后,所有广播接收器几乎都会在同一时刻接收到这条广播消息,所有它们之间没有先后顺序可言。
有序广播: 是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,并且前面的广播接收器还可以截断正在传递的广播。
广播接收器的使用
在我们Android系统中内置了很多系统级别的广播,我们可以在程序中通过监听这些广播来得到各种系统的状态信息。如果想接收到这些广播,就需要使用到广播接收器。广播接收器的注册方式分为两种,动态注册和静态注册,先来看一下动态注册。下面写一个监听网络变化的例子
首先新建一个类让他继承自BroadcastReceiver,并重写父类的onReceive()方法,当有广播到来时,onReceive()方法就会执行。代码如下
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context, "网络已连接", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "网络已断开", Toast.LENGTH_SHORT).show();
}
}
}
首先通过getSystemService()方法得到ConnectivityManager的实例,这是一个系统服务类,用于管理网络连接,然后调用它的getActiveNetworkInfo()方法获得NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法判断当前是否有玩网络。
接下来修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
首先我们创建了一个IntentFilter的实例,并添加了一个值为android.net.conn.CONNECTIVITY_CHANGE的action,这个是当系统网络状态发生改变时,系统发出的一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,我们添加相应的action,就可以监听到什么广播。接下来创建我们上面新建的MyReceiver的实例,然后调用registerReceive()方法进行注册,将MyReceiver的实例和IntentFilter的实例传进去,这样就实现了网络的监听。动态注册的广播接收器一定要取消注册,在onDestory(0中调用unregisterReceiver()来实现。最后别忘了声明权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
上面是动态注册。动态注册的广播接收器可以自由控制注册和注销。下面介绍一下静态注册:只需要在清单文件中进行注册, <intent-filter>
里添加相应的action即可。
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>