广播简介
上小学时,个高的学生负责敲钟,用于上下课。钟声响起,相当于向每个人发送了一个广播。广播有两种:标准/普通广播,有序广播。
标准广播(Normal broadcasts):在钟声响起之时,也就是向所有人发送了一条广播,所有人都能同一时刻收到,不考虑声音传播等问题,所以没有先后顺序可言,这类广播效率是最高的,也无法被截取。比如听到上课铃声的同学与老师都去上课。
有序广播(Ordered broadcasts):正所谓无规矩不成方圆,当下课铃声响起时,还需老师同意方能下课,甚至有的老师拖堂到下一节课。用专业术语描述就是:在同一时刻只有一个广播接收器能接受到该消息,当该广播接收器的逻辑处理完成后,广播才会继续往下传递,所以是有先后顺序的,并且前面的广播接收器还能截取正在传递的广播,不让他继续往下传递。
接受与发送广播
接受广播:
Android系统有很多内置的广播,比如网络的变化,手机开机等,想要获取这些消息,就需要特定的接头暗号,例如:"天王盖地虎,宝塔镇河妖"。
public class MainActivity extends Activity{
private IntentFilter filter;
private BootBroadcastReceiver bootReceiver;
private
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
filter=new IntentFilter();
filter.addAction("android.intent.action.BOOT_COMPLETED");//接头暗号 开机广播
bootReceiver=new BootBroadcastReceiver();
registerReceiver(bootReceiver,filter);//代码注册广播
}
@Override
protected void OnDestory(){
super.onDestory();
unregisterReceiver(bootReceiver);//注销广播
}
class BootBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context,Intent intent){
//do something.
...
}
}
}
依照上面的代码运行,肯定会报权限错误,开机运行是需要权限。
<user-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
在功能清单中添加上述权限,就可以达到设计的目标了。
发送广播:广播可以跨应用在同一台设备上传递消息。也就是说我在QQ发送的广播,微信可以接受。就像系统的广播,你可以接受一样。
1》定义广播接收器
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceiver(){
//do something
...
}
}
当MyBroadcastReceiver接受到广播时,就会执行do something中的事情了,当然少不了注册广播,也就是接头暗语。
2》注册广播
<application>
...
<receiver
android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="com.hyco.yancy.MY_BR"/>
</intent-filter>
</receiver>
</application>
"com.hyco.yancy.MY_BR" 就是接头暗号了。
3》发送广播
public class MainActivity extends Activity{
private
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent("com.hyco.yancy.MY_BR");
//intent 是可以通过键值对传递数据。
sendBroadcast(intent);
}
}
这样就完成了一条广播的发送,只是普通的广播。
而有序广播只需要增加优先级,发送广播的方式改变。
<application>
...
<receiver
android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100">
<action android:name="com.hyco.yancy.MY_BR"/>
</intent-filter>
</receiver>
</application>
Intent intent=new Intent("com.hyco.yancy.MY_BR");
//intent 是可以通过键值对传递数据。
sendOrderedBroadcast(intent,null);
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceiver(){
//do something
...
abortBroadcast();//增加此方法,即可截断广播往下发送
}
}
按照上面的代码,继续增加广播接收器,完成一步一步的传递。同时要去掉abortBroadcast()方法。
拓展:在应用a中发送广播,在b应用中接受。注意:要保证应用没有被杀死,广播没有被注销。
本地广播
经过拓展即可知道,原来我自定的广播可以被别的应用所接收,这就很容易引起安全性问题。而本地广播就是为了解决这一个问题。
本地广播只能在所在的应用中发送与传递,使用起来也是极为方便。
public class MainActivity extends Activity{
private IntentFilter filter;
private LocalBroadcastReceiver localReceiver;
private LocalBroadcastManager manager;
private
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
manager=LocalBroadcastManager.getInstance(this);
filter=new IntentFilter();
filter.addAction("com.hyco.yancy.MY_BR");//接头暗号 开机广播
localReceiver=new LocalBroadcastReceiver();
manager.registerReceiver(localReceiver,filter);//代码注册广播
//发送广播
Intent intent=new Intent("com.hyco.yancy.MY_BR");
//intent 是可以通过键值对传递数据。
manager.sendBroadcast(intent);
}
@Override
protected void OnDestory(){
super.onDestory();
manager.unregisterReceiver(localReceiver);//注销广播
}
class LocalBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceiver(Context context,Intent intent){
//do something.
...
}
}
}
只是多了一个本地广播管理者,可以按照这个方法测试,应用a的广播是否还能被应用b所接收。