广播主要分为两种类型,标准广播和有序广播
标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器都会在同一时刻接收到这条广播,无任何顺序科研,优点是效率高,但同时也意味着无法被截断。
有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,优先级高的广播接收器可以先收到广播消息。
注册广播的方式有两种,在代码中注册和在AndroidManifest.xml中注册,前者称为动态注册,后者被称为静态注册。
创建一个广播接收器:新建一个类,继承自BroadcastReceiver并重写父类的onReceive方法
动态注册:
例如 在代码里
intentFliter=new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver= new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter);
动态注册可以自由控制注册与注销,但是缺点是必须要在程序启动之后才能接收到广播,因为注册的逻辑是卸载onCreate()方法中的。
静态注册
在AndroidManifest.xml里
<receiver android:name=".BootCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.BooT_COMPLETED"/>
</intent-filter>
</receiver>
通过android:name来指定具体注册哪一个广播接收器。然后在<intent-filter>标签加入想要接收到的广播
不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许中是不允许开启线程的,当onReceive()方法运行了较长时间没有结束时,程序会报错,因此广播接收器更多的是扮演一种打开程序其他组件的角色。
发送一条标准广播
例如
Intent intent =new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
发送有序广播
将 sendBroadcast()改成sendOrderedBroadcast()方法。
有两个参数,第一个是intent 第二个是与权限有关的字符串
在注册时设定优先级 在<intent-filter>标签里 添加android:priority="100">
在onReceive方法里添加abortBroadcast()取消传递广播
使用本地广播
解决安全性问题
使用了LocalBroadcastManager来对广播进行管理,并提供发送广播和注册广播接收器的方法。
private LocalReceiver localReceiver
private LocalBroadcastManager localBroadcastManager;
//获取实例
localBroadcastManager=LocatBroadcastManager.getInstance(this)
Intent intetn=new Intent(String str);
//发送广播
localBroadcastManager.sendBroadcast(intent);
注册本地广播
intentFilter.addAction(String str);
localReceiver =new Lo..
localBroadcastManger.registerReceiver(localReceiver,interntFilter);
本地广播是无法静态注册的。
发送本地广播比起发送系统全局广播将会更加有效
如在广播接收器里启动活动,一定要给Intent加入FLAG_aCTIVITY_NEW_TASK标志如:intent.addFlags(FLAG_aCTIVITY_NEW_TASK);