类型:
- 标准广播
没有先后顺序,效率高,无法截断 - 有序广播
有顺序,按优先级,可截断
动态注册
在活动中定义一个类继承自BroadcastReceiver,重写onReceive方法。
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"a",Toast.LENGTH_SHORT).show();
//要实现的逻辑
}
onCreate方法中创建实例IntentFilter,通过addAction添加android.net.conn.CONNECTIVITY_CHANGE(网络状态变化时发出的值)再创建NetworkChangeReceiver,通过 registerReceiver进行注册。
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver=new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
}
最后通过onDestroy中的unregisterReceiver取消注册(不取消注册程序也能运行,传说不取消注册会导致内存泄漏)
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
以上,只要收到网络状态改变的广播,就会进行一次Toast提示。
那么,下面的方法可以实现检测到底是有网还是没网。
在onReceive方法中,添加以下代码
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManger=(ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=connectionManger.getActiveNetworkInfo();
if(networkInfo!=null&&networkInfo.isAvailable()){
Toast.makeText(context,"a",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(context,"b",Toast.LENGTH_SHORT).show();
}
}
}
ConnectivityManager系统服务类,专门检测网络连接
调用getActiveNetworkInfo()得到 networkInfo,用 networkInfo的isAvailable()判断网络状态。
为了访问网络状态。要声明权限。
在注册文件中加入:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
完成。
动态注册较为灵活,而静态注册不需启动该程序,就可以接受广播。
静态注册
首先创建一个广播接收器
在注册文件中,加入相应的要接受的广播的值,如系统开机启动广播值如下:
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
同时,监听系统广播也要开启权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
同时要注意里面的逻辑不能太复杂,耗时。因为不允许开启线程。