BroadcastReceiver
基本分类
- 标准广播(normal broadcasts)
异步执行的广播,发出后会让所有的接收器几乎同时接收到广播,就像这样
2.. 有序广播(ordered broadcasts)
同步执行的广播,按优先级传递广播,当一个接收器内部逻辑执行完毕才会传给下一个接收器。
接收系统广播
接收广播分为两种,一种静态注册,一种动态注册,下面以两个简单例子来实现
动态监听网络变化
- 首先实现一个
NetworkChangReceiver
继承自BroadcastReceiver
class NetworkChangReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"network changed",Toast.LENGTH_SHORT).show();
}
}
-
创建
IntentFilter
和NetworkChangReceiver
的实例,然后调用registerReceiver()
方法注册IntentFilter intentFilter = new IntentFilter(); //添加要监听的广播 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); NetworkChangReceiver receiver = new NetworkChangReceiver(); registerReceiver(receiver, intentFilter);
-
最后我们需要在
AndroidManifest.xml
文件中声明获取网络状态的权限<uses-permission android:name="android.permission.ACCESSS_NETWORK_STATE" />
-
还需要注销注册的实现
/*需要说明的是,如果注册时在onResume()方法里,那么取消最好是在onPause()方法里 *还有就是不要在onSaveInstanceState()方法里取消注册,有可能这个方法不会被执行*/ unregisterReceiver(receiver);
静态注册实现开机启动
-
实现
BootCompleteReceiver
继承自BroadcastReceiver
class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //onReceive()方法里不允许开启线程,也不要添加过多的逻辑和耗时的操作 Toast.makeText(context,"boot completed",Toast.LENGTH_SHORT).show(); } }
在
AndroidManifest.xml
文件中注册和申明权限
//申明权限
<uses-permission andorid:name="android.permission.RECEIVE_BOOT_COMPLETED" />
//注册接收器,在<application>标签里
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
发送自定义广播
广播两种类型,标准广播和有序广播。
发送标准广播
使用Intent
来发送广播,这里接收器参照上面自定义一个就OK了,就不在多说了。
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBrodcast(intent);
发送有序广播
其实和标准广播差不多,只是发送的时候调用的是sendOrderedBroadcast(intent,null)
,这里第二个参数是与权限相关的字符串。
sendOrderedBroadcast(intent, null);
那么如何确定广播的接收顺序呢,这就用到了优先级的设定,在注册广播接收器的时候,可以设定这个接收器的优先级,由此来判定接收器接收广播的顺序。
<receiver android:name=".BootCompleteReceiver" >
<intent-filter android:priority="100">
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
使用本地广播
官方API里对
BroadcastReceiver
的介绍里有这么一句:
If you don't need to send broadcasts across applications, consider using this class with LocalBroadcastManager.
如果不是在应用间传递广播,那么就应该考虑使用本地广播,本地广播使得广播的安全性得到了保证。用法也比较简单。
-
实现一个广播监听器
class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //do something here } }
-
获取
LocalBroadcastManager
实例LocalBroadcastManager localBroadcastManager = LocalBroadcastManager .getInstance(this);
-
注册本地广播监听器
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.learn.broadcasttest.LOCAL_BROADCAST"); LocalReceiver receiver = new LocalReceiver(); localBroadcastManager.registerReceiver(receiver, intentFilter);
-
发送本地广播
Intent intent = new Intent("com.learn.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent);
本地广播无法通过静态注册的方式来接收。
总结
主要学习到了,广播的种类,注册广播接收器的两种方式,注册与取消注册的时机,还有发送两种广播的方式,还有就是本地广播的使用技巧与使用时机。