您的位置:首页 > 移动开发 > Android开发

Android BroadcastReceiver总结

2013-11-09 23:33 330 查看

一、BroadcastReceiver是什么?

  BroadcastReceiver用于系统级别的通信使用。在Android系统中程序(进程)间通信可以使用ADIL、线程间通信可以使用Handler、AsyncTask、而系统级别的系统是否打开WIFI网络,插拔SDCARD,电量低的通知等,都可以通过广播获取到这些信息,当然也可以自定义广播来作为一种通信工具。

建议:
  广播的启动和关闭可以放置在任意地方,官网建议放在Activity.onResume() 开启和Activity.onPause()关闭的原因是节省系统的开销。
只要当前Activity不在活动状态广播就会被关闭。不这样启动和关闭的结果是如果用户已经切换到其他应用或者锁屏,当前应用的广播接收因为没有关闭而在一直运行。
官方文档也不建议在Activity.onSaveInstance() ,因为这个放在并不是每次关闭Activity的时候都会被调用。

二、广播启动与接收

广播的实现步骤分为两步广播注册与发送接收广播

1. 两种广播的注册方式

1.1 静态注册

在AndroidMainfast.xml中注册

< receiver android:name = ".content.BroadcastReceiverDemo" >
< intent-filter>
< action android:name ="demo.content.intent.action.BroadcastReceiverActivityDemo" />
</ intent-filter>
</ receiver>


注意:在AndroidManifest文件中进行配置的广播会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发,即使程序未运行。

1.2 动态注册

// 动态注册广播
BroadcastReceiver broadcastReceiver = new BroadcastReceiver();
Activity.registerReceiver(broadcastReceiver, new IntentFilter());
// 动态取消广播
unregisterReceiver(broadcastReceiver);


注意:动态注册的需要在Activity onDestory方法中进行取消注册,否则会抛出异常

2. 两种广播的发送方式

2.1 无序广播

意思是是针对多个符合条件的广播的接收顺序不确定的,发送代码如下:
Intent intent = new Intent(action);
sendBroadcast(intent);


优点:异步发送效率高
缺点:无法将结果传递给下一个处理者并且终止广播

2.2 有序广播

意思是是针对多个符合条件的广播的接收顺序确定的,并且有先后顺序,发送代码如下
Intent intentOrderBroadcast = new Intent(action);
sendOrderedBroadcast(intentOrderBroadcast, null);


优点:
1. 可以终止广播(BroadcastReceiver.abortBroadcast ()),一旦终止后续不会再接收到广播。
2. 传递数据
优先级高的可以通过setResultExtras ( Bundle) 放置数据。
优先级低的可以通过 Bundle bundle = getResultExtras ( true ) 获取数据。

3 有序广播的接收

在AndroidMainfast.xml中配置receiver的属性android:priority="number" ,范围区间是-1000 ~ 1000 ,设置的数值越大越接收到广播

4. 注册接收系统广播
可以配置Android提供的Action,更多信息可以参考:
Android 文档Intent类 - Standard Broadcast Actions
http://developer.android.com/reference/android/content/Intent.html

三、启动与关闭

关闭后续无法接收到广播BroadcastReceiver.abortBroadcast();;

四、注意

1. 广播安全问题

在android-support-v4.jar包中提供一个LocalBroadcastManager类,顾名思义是用于应用内进行通信的。
不会接收应用外的广播,提高应用内通信的安全性。

2. 避免ANR

广播执行如果超过10秒会出现ANR,接收后的处理操作如果操作这个时间限制最好放到子线程中执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: