版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
概念
标准广播
一种完全异步执行的广播,所有的广播接收器几乎可以同时收到这条广播,无法被截断。
有序广播
一种同步执行的广播,在同一时刻只有一个广播接收器能收到此条广播消息,优先级高的广播接收器先收到广播消息,可以被截断。
接收系统广播
注册广播的方式一般有两种,在代码中注册和在AndroidManifest.xml中注册,前者被称为动态注册,后者被称为静态注册。
动态注册
优点:可以灵活地控制广播接收器的注册和注销。
核心代码实现:
onCreater():{
intentFilter = new IntentFilter();
//监听网络状态切换时系统发出的广播消息对应的action
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
//注册广播接收器
registerReceiver(networkChangeReceiver,intentFilter);
}
onDestroy(){
unregisterReceiver(networkChangeReceiver);
}
class NetworkChangeReceiver extends BroadcastReceiver{
onReceiver(){
//填写接收到对应广播时执行的代码 ......
}
}
静态注册
优点:在程序未启动时就能接收到广播。
核心代码实现:
<manifest ...>
//权限配置
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application>
//使用AS的快捷方式创建广播接收器时会自动生成receiver配置
//Enable属性表示是否启用这个广播接收器
//Exported属性表示是否允许这个广播接收器接收本程序以外的广播
<receiver android:name=".BootCompleteReceiver" android:enable="true" android:exported="true">
//配置需要监听的广播对应的action
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
注意事项
1. onReceive()方法中不能添加过多的逻辑和耗时操作,因为广播接收器中是不允许开线程的。当onReceive()方法运行了较长时间而没有结束时,程序就会报错。
2. 敏感操作需要先配置权限才能进行。
发送自定义广播
发送标准广播
核心代码:
onCreate(){
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//发送标准广播
sendBroadcast(intent);
}
});
}
发送有序广播
核心代码:
onCreate(){
button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
//发送有序广播,第二个参数是一个与权限相关的字符串
sendOrderedBroadcast(intent,null); }
});
}
设置广播接收器的优先级:
<mainfest>
<application>
<receiver>
//配置优先级为100
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
</application>
</mainfest>
截断有序广播:
onReceiver(){
//截断广播消息
abortBroadcast();
}
使用本地广播
使用本地广播机制发出的广播之能够在应用程序内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。
核心代码实现:
onCreate(){
//获取实例
localBroadcastManager = LocalBrocastManager.getInstance(this); button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
//发送本地广播
localBroadcastManager.sendBroadcast(intent); }
});
intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
//注册本地广播监听器
localBroadcastManager.regesterReceiver(localReceiver,intentFilter);
}
onDestroy(){
//注销本地广播监听器
localBroadcastManager.unregisterReceiver(localReceiver);
}
使用本地广播的优点:
1 不必担心发出的广播泄露数据。
2 其他的程序无法发送广播到我们程序的内部。
3 发送本地广播比发送系统全局广播更加高效。