BroadCastReceiver的详解与使用

1.广播:系统在运行的时候会发生很多事件,那么当事件发生的时候系统就会发出广播通知对此类型的广播感兴趣的程序,应用程序使用广播接受者接受广播,以执行相应的代码。(例如电量改变等)

2.广播接受者:BroadCastReceiver,Android四大组件之一,并不是一个Context,是一种消息性组件,可以在不同组渐渐通信及APP之间传递消息。

3.实现原理:

Android中的广播使用了设计模式中的观察者模式,基于消息的发布/订阅

有三个角色:1.广播发送者

2.广播接受者

3.消息中心(AMS)

在这里插入图片描述
原理描述:1.广播接收者通过Binder机制在AMS中注册

2.广播发送者通过Binder机制向AMS中发送广播

3.AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者

4.AMS将广播发送到合适的广播接收者的相应循环队列中

5.广播接收者通过消息队列拿到此广播,并回调OnRecerver()

2

4.使用流程:

1.自定义广播接收者BroadcastRecerver

*继承BroadcastRecerver *复写OnRecerver()方法

*广播接收者接受到相应广播后,会自动回调OnRecerver()方法

*一般情况下,此方法会涉及与其他组件之间的交互,如启动Service等

*OnReceiver()方法运行在UI线程,不能执行耗时操作,否则会报ANR

2.广播接收者的注册:

*静态注册(应用程序关闭后,如果有广播,程序依旧被系统调用)

在清单文件中通过标签声明

*动态注册

在代码中使用Context.registerReceiver()注册

动态广播最好在Activity的OnResume()中注册,OnPause()注销

原因 :*对于动态广播,有注册必然会有注销,否则会导致内存泄漏(注销调用unregisterreceiver()方法)。

        *在OnResume()注册、OnPause()注销是因为OnPause()在APP死亡之前一定会被执行,从而保证广播在APP死亡之前一定会被销毁,从而防止内存泄露。不在OnCreate()、OnDestory()或OnStart()、OnStop()注册、注销是因为:当系统因为内存不足要回收Activity占用的资源时,Activity在执行完OnPause()方法后就会被销毁,有些生命周期方法OnStop()、OnDstory()就不会被执行。当再回到此Activity时,是从OnCreate()方法开始执行。假设我们将广播的注销放在OnStop()、OnDstory()方法,及广播仍未被注销,从而导致内存泄漏。

静态注册优点:不受任何组件的生命周期影响。缺点:耗电,占内存

动态注册优点:灵活,跟随组件的生命周期变化。

3.广播的发送:

发送无序广播调用sendBroadCast()

发送有序广播调用sendOrderdBroadCast()

4.广播的类型:

无序广播:所有的广播接受者都可以接收到此种类型的广播,且不可以被拦截

有序广播:发送出去的广播被广播接收者按照先后顺序接收,按照Priority()属性值从大到小排序,如果值相同,动态注册的广播优先,并且广播可以被拦截(调用.abortBroadCast()),拦截后优先级低的广播接收者便不能收到广播了。

优先级:级别数值是在-1000到1000之间,超出范围也没关系

全局广播:所有的APP都可以接收到该广播

本地广播:只在本APP中传播

系统广播:Android中内置了多个系统广播,每个广播都有特定的Action。例如:Intent.ACTION_SREEN_OFF

5: 广播中传递数据:

获取数据:1.直接从OnReceirver()方法中的Intent获取

2.broaddcastReceiver.getResultData();

更改数据:setResult()

发送无序广播的时候,广播的接收顺序是按照广播在清单文件中声明顺序由上而下执行的。

如果广播的接受者定义了优先级,广播的接收顺序是按照广播接收者的优先级执行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章