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

Android开发总结笔记 四大组件之BroadcastReceiver 1-2-7

2015-10-19 16:14 761 查看







1、概述

首先,来了解一下,这个BroadcastReceiver(广播接收者)是个什么东西。(API)

官方的文档中没有啥描述,按照我自己的理解,这个组件就是一个全局的监听器。就是说可以在任何地方发送或者接收。

基本也就这样了。

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"来控制安全性
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: