第五章详解广播机制
广播机制简介
广播的类型主要分标准广播、有序广播。
接收系统广播(注册广播的两种方式)
创建一个广播接收器–>新建一个类并继承BroadcastReceiver–>重写父类的onReceive()方法。
动态注册(代码中注册)
注册用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法。此方法需要两个参数,需要提前声明。
声明private :IntentFilter intentFilter = new IntentFilter(),然后intentFilter.addAction(String action);
BroadcastReceiver receiver = new BroadcastReceiver();书中例子为private NetworkChangeReceiver networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(receiver, filter)
动态注册的广播接收器一定都要取消注册:unregisterReceiver(receiver);书中例子为:unregisterReceiver(networkChangeReceiver);
书中例子进一步优化,准确地告诉用户是否有网络:在onReceive()方法中,首先通过getSystemService()方法得到了ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接的。然后调用它的getActiveNetworkInfo()方法可以得到NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法,就可以判断出当前是否有网络。
程序访问系统关键性信息,书中例子查询网络状态需在配置文件中声明权限:
静态注册(Androidmanifest.xml中注册)
优点是程序未启动的情况下就能接收广播
通过AS提供的快捷方式创建一个veBroadcastReceiver,Exported属性表示是否允许这个广播接收器接收本程序之外的广播,Enabled属性表示是否启用这个广播接收器,代码中复写onReceive()方法,在里面编写自己的逻辑。
监听系统开机广播声明权限
在标签内添加,静态注册的广播接收器就在里面注册:通过android:name指定哪一个广播接收器,然后在标签中加入想要接收的广播。
不要再onReceive()方法中添加过多的逻辑或者耗时操作,因为广播接收器中是不允许开启线程,方法运行过久而没有结束,系统会报错。
发送自定义广播
发送标准广播
<1>以书中用例子来讲解:先定义一个静态的广播接收器。
<2>定义一个按钮,并设置它的点击事件,并构建一个intent对象且同时传入值(action)入内:
Intent intent = new Intent(String action);
<2>调用Context的sendBroadcast()方法将广播发送出去:
sendBroadcast(intent);
发送有序广播
以书中用例子来讲解:新建一个项目,定义一个静态的广播接收器且接收值和标准广播接收器的值一样,然后在上面例子的程序中发送标准广播,且同时能被两个接收器接收,从而证明发送的广播能被其他程序接收到。
定义一个按钮,并设置它的点击事件,并构建一个intent对象且同时传入值(action)入内:Intent intent = new Intent(String action);
调用Context的sendOrderedBroadcast()方法将广播发送出去(第二个参数是与权限相关的参数): sendBroadcast(intent,null);
在广播接收器中可以截断广播,阻止其继续传播:abortBroadcast();
在AdroidManifest中广播接收器设置优先级:Android:priority=
使用本地广播
发出的广播只能在程序内部进行传递,接收器也只能接收本程序发出的广播,解决了安全性问题。
以书中例子来讲解
<1>先声明两个变量:
private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManger;
<2>创建一个广播接收器
class LocalReceiver extends BroadcastReceiver{}
<3>通过LocalBroadcastManager的静态方法getInstance()方法得到它的一个实例:
localBroadcastManger = LocalBroadcastManager.getInstance(this)
<4>发送本地广播
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST") localBroadcastManager.sendBroadcast(intent)
<5>通过LocalBroadcastManager的静态方法registerReceiver()注册广播并接收本地广播:
intentFilter = new IntentFilter(); intentFilter.addAction(("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter);
本地广播无法通过静态注册的方式来接受,因为也不需要,本地广播币全局广播更高效。