静态动态广播的使用、全局本地广播的使用、广播的拦截,要求:观察并打印生命周期方法、思考广播的使用场景
2019.6.17上午~2019.6.19下午
动态注册
动态注册的广播接收器可以自由的注册和注销,但是要在程序启动后才能收到广播。
启动时显示网络可用
关闭数据,改变网络状态,显示网络不可用
- MainActivity
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();
}
}
}
}
创建广播接收器:新建一个内部类继承自BroadcastReceiver,重写父类的onReceive()方法。有广播来时,onReceive()方法会执行,具体的逻辑可以在这个方法中处理。
首先通过getSystemService()方法得到了ConnectivityManager (一个系统服务类,专门用于管理网络连接)的实例。再调用NetworkInfo 的isAvailable方法,判断出当前是否有网络。
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 = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //网络状态改变时系统发出的广播
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter); //注册广播接收器
}
广播接收器想要监听的广播添加到intentFilter(过滤器)里的action中。
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
动态注册的广播接收器一定要取消注册,通过调用unregisterReceiver来实现()。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
这里查询网络状态需要在AndroidManifest.xml中声名权限
静态注册
程序未启动的情况下也可以收到广播
↓让程序接收一条开机广播
- BootCompleteReceiver.java
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();
}
}
新建一个类,不再使用内部类,因为要在AndroidManifest.xml中注册这个类名
- AndroidManifest.xml
<receiver android:name=".MainActivity$BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
< receiver>
所有静态注册的广播接收器都在这里进行注册。android:name指定注册哪一个广播接收器,在< intent-filter>意见过滤器 里加入想要接收的广播。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
同时声明权限
全局广播——发送自定义广播
发送标准广播
//标准广播
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_SHORT).show();
//abortBroadcast(); //截断
}
新建一个类,当MyBroadcastReceiver收到自定义的广播时, 弹出“received in MyBroadcastReceiver”。
- AndroidManifest.xml
<receiver android:name="com.sky.broadcasttestapplication.MyBroadcastReceiver">
<intent-filter>
<action android:name="com.sky.broadcasttestapplication.MY_BROADCAST"/>
</intent-filter>
</receiver>
静态注册,让MyBroadcastReceiver接收一条值为"com.sky.broadcasttestapplication.MY_BROADCAST"的广播
- 在activity_main.xml中设置一个button
- MainActivity.java的onCreate方法中
mBtnstand.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view