动态注册的广播可以自由的控制注册与注销,在activity中定义内部类还可以实现更改ui。但是必须在启动程序之后才能接收到广播。如果要想实现在程序未启动的情况下就能接收广播,需要使用静态注册。
第一步,新建一个BroadcastTest项目,然后修改MainActivity中的代码:
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建IntentFilter实例,并添加action
intentFilter = new IntentFilter();
//当网络发生变化时,系统发出的广播为android.net.conn.CONNECTIVITY_CHANGE
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//创建NetworkChangeReceiver实例
networkChangeReceiver = new NetworkChangeReceiver();
//调用registerReceiver()方法进行注册
registerReceiver(networkChangeReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//活动结束时,调用unregisterReceiver方法实现取消注册
unregisterReceiver(networkChangeReceiver);
}
//创建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法即可。
//具体的处理逻辑是在onReceive()中执行(不支持多线程,所以不要处理太复杂的信息)
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();
}
}
}
}
第二步,因为要访问系统的网络状态,所以需要申请权限,在AndroidManifest.xml中添加
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这样就完成动态注册广播