Android开发总结笔记 四大组件之BroadcastReceiver 1-2-7
2015-10-19 16:14
761 查看
1、概述
首先,来了解一下,这个BroadcastReceiver(广播接收者)是个什么东西。(
官方的文档中没有啥描述,按照我自己的理解,这个组件就是一个全局的监听器。就是说可以在任何地方发送或者接收。
基本也就这样了。
BroadcastReceiver分为两种方式,一个是有序广播,一个是无序广播。
无序广播:调用Context.sendBroadcast方法,这种方式完全是异步的,这个广播的所有接收者会同时执行,会更高效。但是同时带来的限制是,不能终止和使用它的结果。
有序广播:调用Context.sendOrderedBroadcast方法,每次只会执行一个接收者。每个接收者会轮流执行,处理结果可以传递到下一个接收者
有些情况下,即使使用的是无序广播,系统一次也只能传递一个广播给接收者。特别是那些请求创建进程的接收者,这时候为了避免系统因为新建的进程而负载过度,一次只会允许一个接收者运行。在这种情况下,它的限制依然是存在的(不能终止和使用它的结果)
当BroastReceiver的onReceive()返回了之后,就不再活动。所以这个时候比较容易被系统杀死,所以,如果需要广播来执行一些耗时性的任务,可以将BroastReceiver和Service结合起来使用。
2、BroastReceiver的基本用法
注册广播的两种形式
动态注册:在Java代码中进行注册,在应用启动之后才能接收广播,务必要记得反注册。
静态注册:在AndroidManifest.xml用标签注册,可以在程序未启动的情况下接收广播
动态注册
监听网络状态的变化。
publicclassPhoneReceiverextendsBroadcastReceiver{
publicstaticfinalStringACTION="android.net.conn.CONNECTIVITY_CHANGE";
@Override
publicvoidonReceive(Contextcontext,Intentintent){
if(ACTION.equals(intent.getAction())){
Toast.makeText(context,"网络状态发生变化",Toast.LENGTH_SHORT).show();
}
}
}
publicclassMainActivityextendsAppCompatActivity{
privatePhoneReceiverphoneReceiver;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initReceiver();
}
privatevoidinitReceiver(){
phoneReceiver=newPhoneReceiver();
IntentFilterintentFilter=newIntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(phoneReceiver,intentFilter);
}
@Override
protectedvoidonPause(){
super.onPause();
unregisterReceiver(phoneReceiver);
}
}
要记得反注册
静态注册
同样的一个receiver,不是在Java代码中注册,而是在AndrodManifest.xml中注册
<receiverandroid:name=".PhoneReceiver">
<intent-filter>
<actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE"></action>
</intent-filter>
</receiver>
3、发送广播
注册的方法一样,只需要创建按钮注册事件进行发送广播和修改一下Intent的Action即可
无序广播:sendBroadReceiver
有序广播:sendOrderedRecevier
在AndrodManifest.xml中可以设置优先级android:priority="100"(-1000~1000)
abortBroadcast()可以中断广播
4、BroadcastReceiver的安全性问题
因为BroadcastReceiver的广播是全局性的,我们自己应用发出的广播,可能被其他应用接收。同样,其他应用发送的广播,也有可能被我们自己的应用接收,这就引发了一个安全性的问题。所以Android为我们提供了一套安全机制,本应用发送的广播只能在本应用范围内接收。
这套机制的一个核心类就是LocalBroastManager
然后代码如下。
publicclassMainActivityextendsAppCompatActivity{
privateReportReceiverreportReceiver;
privateLocalBroadcastManagerlocalBroadcastManager;
privateButtonmReport;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
privatevoidinit(){
reportReceiver=newReportReceiver();
IntentFilterintentFilter=newIntentFilter();
intentFilter.addAction("android.intent.receiver.reported");
localBroadcastManager=LocalBroadcastManager.getInstance(this);
localBroadcastManager.registerReceiver(reportReceiver,intentFilter);
mReport=(Button)findViewById(R.id.btn_report);
mReport.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
localBroadcastManager.sendBroadcast(newIntent("android.intent.receiver.reported"));
}
});
}
@Override
protectedvoidonPause(){
super.onPause();
localBroadcastManager.unregisterReceiver(reportReceiver);
}
}
要注意的问题
使用LocalBroastManager只能动态注册。
LocalBroastManager比全局广播更高效
如果要在启动Activity的话,必须新建一个栈
如果要弹系统的对话框,要用TYPE_SYSTEM_ALERT
同样,官方文档也指出,可以通过Intent.setPackage和android:export="false"来控制安全性
相关文章推荐
- android蛋疼的OOM
- android 串口调试
- Android支付宝集成
- AndroidStudio的一些坑
- WAYS TO UPDATE YOUR DEVICE
- Android init.rc文件解析过程详解(一)
- android应用框架系列二,图形界面
- AndroidStudio提交代码到Github(详细图文)
- android studio 在release打包时修改AndroidManifest.xml
- Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式
- [转载]Google Android开发精华教程
- 将Eclipse代码导入到AndroidStudio的两种方式
- Android:Android 6.0新特性
- 用Gradle 构建你的android程序-依赖管理篇
- android两个含有图片的TextView控件如何并列对称水平摆放
- 用Gradle 构建你的android程序
- android listview converView+ viewHolder
- android fragment hidenChanged方法分析
- Android之Activity跳转
- androidapk IIS文件 解除IIS文件下载限制