Android四大组件之BroadCast

  • 内容
  • 评论
  • 相关

Android中广播的分类

Android广播大致分为三类:

Normal Broadcast   普通广播

Ordered broadcast  有序广播

Sticky Broadcast      粘性广播

我们常用到的是前面两种,第三种广播已经被弃用,所以不会详细介绍,下面是官方文档弃用它的原因

This method was deprecated in API level 23.

Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems.The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current valuewhenever desired.

普通广播和有序广播的特点

  • 普通广播:

同级别广播的接收是无序的(随机)

级别低的后收到广播

广播接收器不能截断广播也不能处理广播

同级别的广播,动态注册的先于静态注册的接收到

  • 有序广播

同级别的广播接收是无序的

高级别的广播接收器收到广播以后可以截断广播,让低级别的无法接收

接收器能处理广播

同级别的广播,动态注册的先于静态注册的接收到

广播的使用

广播的使用大致分为,定义广播接收器,注册广播,注册广播又分为静态注册和动态注册

  • 定义广播接收器

定义广播接收器只需要新建一个类,继承自BroadcastReceiver,并覆写其onReceive方法,在里面进行广播的处理

注意:

广播接收器是运行在主线程中的,在里面进行耗时操作会阻塞UI线程,当阻塞5秒左右,就会提示ANR(Application No Response),也不能在里面启动新线程,因为广播的生命周期很短,当onReceive方法结束后,广播生命就结束了,里面启动的线程就会变成没有组件的空进程,在系统需要内存时,这类进程会被优先处理掉,应该通过Intent发送给Service,让Service来完成

  • 注册广播接收器

静态注册:需要定义intent-filter来过滤广播,android:priority是设置广播优先级,为-1000~1000之间的整数

动态注册:需要一个BroadcastReceiver实例以及一个IntentFilter实例,通过下面的函数来注册。

下面是一个动态注册的demo,其中Bc为继承BroadcastReceiver的类

注意:动态注册的广播需要通过unregisterReceiver(BroadcastReceiver  obj)方法去取消注册,可以在Activity里的onDestroy方法里面使用

  • 发送广播

发送广播类似于在一个Activity中启动另一个Activity,需要使用Intent

一、把信息装入一个Intent对象(如Action,Category)

二、调用相应的方法发送广播普通广播:sendBroadcast(),有序广播:sendOrderBroadcast()

发送出去的广播会根据这个Intent对象去匹配已经注册了的广播接受者的Intent-filter,匹配到的,则调用其广播接受者的onReceiver方法

发送普通广播:

发送有序广播:

好了,上面就是广播的大致使用方法了,上面提到的两种广播的特点,写一个demo验证一下就能理解了

有序广播中特有的方法

上面已经说了,有序广播高级别的广播接收者可以截断和处理广播,下面介绍下怎样截断广播和处理广播

截断广播非常简单,在高级别广播接受者的onReceiver里面调用abortBroadcast(); 则广播不会继续发送给低级别的广播接受者,这个可以用在拦截垃圾短信以及垃圾来电

处理广播:当高级别的广播接受者收到广播以后,可以通过setResultData(String string),或者setResultExtras(Bundle bundle)去设置处理的结果,然后低级别的通过String getResultData(),或者getResultExtras(Boolean bool)等方法获取处理的结果。在我测试的过程中发现,在发送广播的时候,Intent对象里面有数据,那么Intent里面的数据是不会被修改的,在public void onReceive(Context context, Intent intent);的第二个参数中可以获取原始的数据。

评论

0条评论

发表评论

邮箱地址不会被公开。