广播的使用

来源:互联网 发布:js获取动态时间 编辑:程序博客网 时间:2024/06/06 09:39

广播接收器:

广播接收器(BroadCastReceiver)是Android系统的四大组件之一,他可以用来监听系统发送的各种广播(例:监听电池电量),也可以用来监听我们自己发送的广播,他的生命周期是从调用广播接收器对象,到onreceive方法执行结束,10s内就完成了。广播接收器中的onreceive方法是在主线程中执行的,执行时间不能超过10s,否则会造成ANR广播根据注册方式的不同分为常驻型广播//静态广播和动态广播,而根据功能接收方式顺序的不同划分为普通广播、系统广播、有序广播、粘性广播,下面来详细的介绍下

1.      普通广播:是异步执行的,发送后可以被所有监听该广播的接收器接收到,缺点是没有传递性,不能将处理结果传递给下一个广播接收器,无法终止广播的传播

广播接收器的定义

定义一个类继承BroadcastReceiver,重写onreceiver方法就可以了

广播接收器的注册

常驻型的广播注册是在清单文件中注册的,该广播接收器会一直处于监听状态,当你的应用程序退出后仍会继续监听,这样的广播虽说使用上非常方便但他特别耗费手机电量

<receiverandroid:name=”.MyReceiver”>

<intent-filter>

<actionandroid:name=”自己规定的动作”/>

<intent-filter>

<receiver>

动态广播注册是在Activity中注册的,他的监听随着Activity的关闭而结束,对于动态广播oncreate时注册,在ondestroy时销毁

ReceiveBroadCast receiver=new ReceiveBroadCast();

IntentFilterfilter=new IntentFilter(MyConst.action_patientListFragment);//意图过滤器其中包含过滤的动作

registerReceiver(receiver,filter);

 

销毁:unregisterReceiver(receiver);

 

普通广播的发送

广播接收器注册后会后有对应的IntentFilter过滤规定的动作,我们定义好一个该动作的Intent然后调用Context.sendBroadcast();方法就发送出去了一个广播

Intent intent =new Intent(MyConst.action_patientListFragment);//规定动作的Intent

sendBroadcast(intent);

2.      有序广播:接收者规定优先级,优先级越高,越先接收到广播,然后广播才会继续传播,优先级的声明是在IntentFilter中设置priority的值,其值的范围是-1000-1000,数越大越早接收到广播,先接收到广播的可以对广播传入的数据进行修改,也可以停止广播的继续传播,这样其他接受者就接收不到广播。

 

广播接收器的定义同上

 

有序广播的注册同普通广播相同,只是在注册广播时若是注册静态广播则在

<intent-filter android:priority="1000"></intent-filter>,动态广播则调用IntentFilter的setPriority()设置

 

有序广播的发送

同普通广播相同 只是发送广播的方法是sendOrderedBroadcast();

 

有序广播优先接收到的广播传递给下一个接收者时可以通过BroadcastReceiverl类的setResultExtras(Bundle)处理(处理的是Bundled对象),而下一个接收者可以通过BroadcastReceiver的Bundle bundle=getResultExtras(true);方法获取到上一个接收者传递的数据

 

有序广播的终止可以通过BroadcastReceiver的abortBroadcast()方法终止广播,终止后后面的广播接收器则不能再接收广播了

 

 

广播发送时可以传递数据给接收者:可以将数据通过Intent传递给接收者,然后通过onreceiveIntent参数获取传递过来的数据

 

广播接收器中的方法必须在10s内执行完,否则就会造成ANR(Application No ResPonse)弹出应用程序无响应,请关闭应用程序的对话框,若必须在应用程序中执行耗时操作则启动一个Service,不要在onreceive中重新启动线程,因为广播的生命周期十分短暂,可能线程还没有执行完成,广播就已经退出了,此时进程虽然还在运行,但因该进程不包含任何活动组件,系统可能在内存紧张时优先结束该进程,导致BroadcastReceiver启动的子线程不能执行完成

 

 

 

程序一直弹出应用程序无响应,请关闭程序的对话框的原因是我们的应用程序中有在UI线程中执行耗时操作即执行的某个方法在10s内无法完成,这就是ANR(Appliation No ResPonse)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 80多岁老人发烧怎么办 小孩香蕉吃多了怎么办 7个月宝宝缺钙怎么办 宝宝脖子被汗淹到红了脱皮怎么办? 小儿出汗多咳嗽怎么办吃什么 牛高烧不退怎么办最好 猪体温低不吃食怎么办 小孩发烧咳嗽怎么办吃什么药 大晚上发烧39度怎么办 胃受凉了老打嗝怎么办 大人发低烧怎么办如何退烧 吃了退热药不退热怎么办 猪持续高烧不退怎么办 猪感冒了不吃食怎么办 6岁儿童发烧38度怎么办 5岁儿童发烧38度怎么办 7岁儿童发烧38度怎么办 儿童发烧到38度怎么办 4岁儿童发烧38度怎么办 9岁儿童发烧38度怎么办 5儿童发烧38度怎么办 咳嗽了20多天怎么办 嘴角烂了怎么办涂什么药 感冒发烧到39度怎么办 6岁宝宝发烧头痛怎么办 生完孩子耻骨疼怎么办 顺产底下外阴红肿伤口流脓怎么办 产后便秘怎么办什么方法最有效 一周岁宝宝拉肚怎么办 三岁宝宝拉水怎么办 喝了过期的青汁怎么办 吃了黑心的苹果怎么办 新生儿两天没拉大便怎么办 贝亲奶瓶不漏怎么办 满月婴儿吃多了怎么办 婴儿吃撑了哭闹怎么办 新生儿吃撑了怎么办啊 新生儿吃了奶粉不吃奶怎么办 新生儿不吃奶也不吃奶粉怎么办 奶瓶吸奶费力不顺畅怎么办 宝宝吃奶粉太勤怎么办