第五章 全局大喇叭——详解广播机制
5.1 广播机制简介
Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。
Android提供了一套完整的API,允许应用西横须自由地发送和接收广播。
发送广播可以使用Intent,接收广播需要一个广播接收器。
广播的类型:1)标准广播 2)有序广播
1)标准广播:一种完全异步执行的广播,所有广播接收器几乎在同一时刻接收到这条广播。
2)有序广播:同步执行的广播,广播发出后同一时刻只有一个广播接收器能接收到,这一个广播接收器中的逻辑执行完毕后,广播才会继续传递。
5.2 接收系统广播
Android内置了很多系统级别的广播,我们可以在应用程序中通过坚挺这些广播来得到各种系统的状态信息。比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播。
5.2.1 动态注册监听网络变化
广播接收器可以自由的对自己感兴趣的广播进行注册,这样当有响应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。
注册广播一般有两种方式:在代码中注册(动态注册)和在AndroidManifest.xml中注册(静态注册)
//创建一个广播接收器,就是新建一个类,让他继承自Broadcast-Receiver并重写父类的onReceive方法
//当有广播来的时候,onReceive方法就会得到执行
//通过动态注册的方式编写一个能够监听网络变化的程序
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);
intentFiler = new IntentFiler();
//创建一个一个intentFiler并给他赋值android.net.conn.CONNECTIVITY_CHANGE的active
//当网络发生变化时,系统发出的正式一条值为android.net.conn.CONNECTIVITY_CHANGE的action
//广播接收器想监听什么广播,就在这里添加响应的action
intentFiler.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerRecevier(networkChangeReceiver,intentFiler);
//注册之后,networkChangeReceiver就会接收到值为android.net.conn.CONNECTIVITY_CHANGE的广播
}
@Override
protected void onDestroy() {
super.onDestory();
unregisterReceiver(networkChangeReceiver); //动态注册的广播一定要取消注册
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceiver(Context context, Intent intent) {
Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
}
}
}
//修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
...
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceiver(Context context, Intent intent) {
//通过getSystemService方法得到ConnectivityManager的实例,这是一个系统服务类,用于专门管理网络连接的
ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//调用它的getActiveNetworkInfo方法来得到networkInfo实例
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
//调用networkInfo的isAvailable方法来判断是否有网络
if(networkInfo != null && networkInfo.isAvailable()) {
Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
}
}
}
}
注意:这里访问系统的网络状态需要声明权限
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>
5.2.2 静态注册实现开机启动
动态注册的广播接收器可以自由地控制注册于注销,在灵活性方面有很大的有事,但是他也存在着一个缺点,就是必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的,静态注册可以让程序在未启动的情况下就能接收到广播。
//BootCompleteReceiver中的代码
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceiver(Context context,Intent intent) {
Toast.makeText(context,"nihao",Toast.LENGTH_SHORT).show();
}
}
//注意:静态广播接收器一定要在AndroidManifest.xml文件中注册才可以使用
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="c