android BroadcastReceiver学习-程序员宅基地

技术标签: broadcastReciver  android学习  android  

BroadcastReceiver

1、简介

1>广播接收者( BroadcastReceiver )用于接收广播 Intent ,广播 Intent 的发送是通过调用 Context.sendBroadcast() 、 Context.sendOrderedBroadcast() 来实现的。通常一个广播 Intent 可以被订阅了此 Intent 的多个广播接收者所接收。

 

2>广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播进行过滤接收并响应的一类组件;

 

3>来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。

 

  4>BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动 Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等。

2、BroadCastReceiver的机制

(1) 机制

在 Android 里面有各种各样的广播,比如电池的使用状态,电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。如图:


 

(2) 实现

用接收短信举例:

第一种方式 :

实现

public class MyBroadcastReceiver extends BroadcastReceiver {

// action 名称

    String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED" ;

    public void onReceive(Context context, Intent intent) {

       if (intent.getAction().equals( SMS_RECEIVED )) {

           // 相关处理 : 地域变换、电量不足、来电来信;

       }

    }

}

 

系统注册:在 AndroidManifest.xml 中注册

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "1000" >             

< action android:name = " android.provider.Telephony.SMS_RECEIVED" />

           </ intent-filter >

       </ receiver > 当然了需要权限 :

< uses-permission android:name = "android.permission.RECEIVE_SMS" />

< uses-permission android:name = "android.permission.SEND_SMS" />

 

 

 

 

 

第二种方式:

// 广播接收者 - 广播的接收

private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {

       @Override

       public void onReceive(Context context, Intent intent) {

 

          // 相关处理,如收短信,监听电量变化信息

 

       }

    };

 

代码中注册:

IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );

 

registerReceiver( mBatteryInfoReceiver , intentFilter);

 

3、生命周期

描述了 Android 中广播的生命周期,其次它并不像 Activity 一样复杂,运行原理很简单如下图:

   

              调用对象   ----------->  实现OnReceive() ------------------->结束

 

1>生命周期只有十秒左右,如果在 onReceive() 内做超过十秒内的事情,就会报错 。

2>每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在

 

BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框。

 

3>如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成 . 这里不能使用子线程来解决 , 因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束 BroadcastReceiver 就先结束了 .BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的 所在进程很容易在系统需要内存时被优先杀死 , 因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀死 , 那么正在工作的子线程也会被杀死 . 所以采用子线程来解决是不可靠的 .

4、广播类型及广播的收发

(1)广播类型

1>普通广播 (Normal broadcasts)

  发送一个广播,所以监听该广播的广播接收者都可以监听到改广播。异步广播 , 当处理完之后的Intent ,依然存在,这时候registerReceiver(BroadcastReceiver, IntentFilter) 还能收到他的值,直到你把它去掉 , 不能将处理结果传给下一个接收者 , 无法终止广播 .

2>有序广播 (Ordered broadcasts)

按照接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,-1000 到 1000 之间 , 值越大 , 优先级越高 . 可以终止广播意图的继续传播 . 接收者可以篡改内容 .

(2)广播的收发

1>简介

该组件接收被广播的 intent,Context 可以通过 sendBroadcast() 和 sendOrderedBroadcast() 方法实现广播的发送 .

 

首先在需要发送信息的地方 ,把要发送的信息和用于过滤的信息 ( 如 Action 、 Category) 装入一个 Intent 对象 ,然后通过调用 Context.sendBroadcast() 、sendOrderBroadcast() 或 sendStickyBroadcast() 方法,把 Intent 对象以广播方式发送出去。

 

使用 sendBroadcast() 或 sendStickyBroadcast() 方法发出去的 Intent ,所有满足条件的 BroadcastReceiver 都会随机地执行其 onReceive() 方法

 

2>普通广播的发送和接收

sendBroadcast(intent);

 

Intent intent = new Intent( "cn.lenovo.yangguangf " ); sendBroadcast(intent);

priority :这个是 AndroidManifest.xml 中 intent-filter 的参数。

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "1000" >

< action android:name = "cn.lenovo.yangguangfu" />

</ intent-filter >

</ receiver >

 

sendOrderedBroadcast(intent, receiverPermission);

1 ,他决定该广播的级别,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;

2 ,同级别接收是先后是随机的;级别低的收到广播;

3 ,在 android 系统中只要监听该广播的接收者,都能够收到 sendBroadcast(intent) 发出的广播 ;

3 不能截断广播的继续传播,

4 实验现象,在这个方法发来的广播中,代码注册方式中,收到的广播的先后和注明优先级最高的他们的先后是随机。如果都没有优先级,代码注册收到为最先。

3>有序广播的发送和接收:

sendOrderedBroadcast(intent, receiverPermission);

 

sendOrderedBroadcast(intent, receiverPermission, resultReceiver,

 

       scheduler, initialCode, initialData, initialExtras)

 

意图,广播,所有匹配的这一意图将接收机接收广播。

 

receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。

resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。

调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。

initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;

initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;

initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;   

 

1,  该广播的级别有级别之分,级别数值是在 -1000 到 1000 之间 , 值越大 , 优先级越高;

 

2,  同级别接收是先后是随机的,再到级别低的收到广播;

 

3,  同级别接收是先后是随机的,如果先接收到的把广播截断了,同级别的例外的接收者是无法收到该广播的。( abortBroadcast() )

 

4 ,能截断广播的继续传播,高级别的广播收到该广播后,可以决定把该钟广播是否截断掉。

 

5 ,实验现象,在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。

4>异步广播的发送和接收:

sendStickyBroadcast(intent);

当处理完之后的Intent ,依然存在,直到你把它去掉。

发这个广播需要权限:

<uses-permission android:name="android.permission.BROADCAST_STICKY" />

去掉是用这个方法removeStickyBroadcast(intent); 但别忘了在执行这个方法的应用里面 AndroidManifest.xml 同样要加上面的权限;

sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,

       initialCode, initialData, initialExtras)

这个方法具有有序广播的特性也有异步广播的特性。

 

实验现象( sendStickyOrderedBroadcast ()中),在这个方法发来的广播中,代码注册方式中,收到广播先后次序为:注明优先级的、代码注册的、没有优先级的;如果都没有优先级,代码注册收到为最先。

(3)广播注册与注销

    1>注册广播
①   代码中注册广播:

注册广播方法一:

 registerReceiver(BroadcastReceiver receiver, IntentFilter filter) ,第一个参数是我们要处理广播的 BroadcastReceiver (广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器。

 

注册广播方法二:

 registerReceiver(receiver,filter,broadcastPermission,scheduler) ,第一个参数是 BroadcastReceiver (广播接收者,可以是系统的,也可以是自定义的);第二个参数是意图过滤器;第三个参数是广播权限;第四个参数是 Hander ;

 

注意:权限重复现象,如果功能清单文件里注册了权限,在该方法再注册,则 receiver 无法收到广播,如果功能清单文件里没有注册了权限,该方法注册也无法收到。当该方法没有注册权限,功能清单里注册的时候, receiver 能收到广播。

 

总结:在 Activity 中代码注册广播建议在: onResume() 中注册;   

 

②系统中注册广播:(在 AndroidManifest.xml中)

< receiver android:name = ".MyBroadcastReceiver" >

           < intent-filter android:priority = "900" >

                  < action android:name = "cn.lenovo.yangguangfu" />

           </ intent-filter >

</ receiver >

 

有时候还要根据发送广播是否指定权限,来决定是否要权限;

 

2>广播注销

在 Activity 中代码注销广播建议在: onPuase() 中注销;

 

不要这里面注销 Activity.onSaveInstanceState(), 因为这个方法是保存 Intent 状态的。 

5、BroadCastReceiver API

abortBroadcast ():

这个方法可以截获由 sendOrderedBroadcast () 发送来的 广播,让其它广播接收者无法收到这个广播。

 

clearAbortBroadcast ()

这个方法是针对上面的 abortBroadcast() 方法的,用于取消截获广播。这样它的下一级广播接收者就能够收到该广播了。

 

getAbortBroadcast ()

这个方法作用是:判断是否调用了 abortBroadcast (),如果先调用 abortBroadcast (),接着再调用 getAbortBroadcast (),将返回 true; 如果在调用 abortBroadcast() 、 clearAbortBroadcast () getAbortBroadcast (),将返回 false;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/T_T_X_S/article/details/10425469

智能推荐

Listener,Filter ,Intercept_filter和intercept-程序员宅基地

文章浏览阅读371次。由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时候,发现为什么struts1要用servlet,而struts2要用filter呢?一时又发现,servlet和filter有什么区别呢?于是看了看web.xml,一时又发现,咦,servlet、filter、listener?还有个interceptor?对于这_filter和intercept

Guava Cache三种被动更新机制与过期监听器removalListener_expireafterwrite-程序员宅基地

文章浏览阅读1.2k次。Guava Cache三种被动更新机制:expireAfterWrite与refreshAfterWrite的不同_expireafterwrite

2024最新前端面试题(八股文)一阶段总结(html,css)!!!!新手必看必背!通俗易通!全面!全是干货!_前端面试题2024-程序员宅基地

文章浏览阅读2.5k次,点赞28次,收藏44次。•支持动画,只有全透明和不透明两种模式,只有 256 种颜色,适用于简单动画、徽标和简单图形等应用场景。•常见格式,采用有损压缩算法,保持图像质量的同时减小文件大小 ,体积较小,不支持透明,不支持动画采用无损压缩算法,体积也相对较小,支持透明背景,不支持动画一般会保存颜色及形状相对简单的图片,可任意放大图形显示,边缘异常清晰画质最好,文件太大,不利于网络传输谷歌开发的一种图片格式,较小的文件大小,较高图像质量,格式新,要考虑兼容性._前端面试题2024

厦门国际银行数创金融杯建模大赛_2020厦门国际银行数创金融杯建模大赛-程序员宅基地

文章浏览阅读4.6k次,点赞6次,收藏18次。2020厦门国际银行数创金融杯建模大赛baseline分享成绩:0.34比赛地址:https://www.dcjingsai.com/v2/cmptDetail.html?id=439&=76f6724e6fa9455a9b5ef44402c08653&ssoLoginpToken=&sso_global_session=e44c4d57-cd19-4ada-a1d3-a5250252bf86&sso_session=irjO90jPA0%205ytlVRkI1fA%3D_2020厦门国际银行数创金融杯建模大赛

python输入四个整数、要求按由小到大的顺序输出_输入4个整数,要求按由小到大的顺序输出(用C++)...-程序员宅基地

文章浏览阅读6.3k次。#includeusingnamespacestd;intmain(){doublea,b,c,d,e;cin>>a>>b>>c>>d;if(a>b){e=a;a=b;b=e;}if(c>b){if(d>c)cout<#includeusing namespace std;int main(){double a,b,c,d,e..._python输入四个整数,请把这四个数由小到大输出

预加载 Skeleton Screen(骨架屏)介绍_首页预加载骨架-程序员宅基地

文章浏览阅读589次。用户体验一直是前端开发需要考虑的重要部分,在数据请求时常见到锁屏的loading动画,而现在越来越多的产品倾向于使用Skeleton Screen Loading(骨架屏)替代,以优化用户体验。_首页预加载骨架

随便推点

php fpm xcache,php扩展xcache-程序员宅基地

文章浏览阅读57次。xcache模块可以缓存php运行时编译生成的opcode可以加速php程序的效率安装xcache和安装memcache方法类似,都是以扩展的方式安装1、安装xcache扩展tar -xvf xcache-3.2.0.tar.gzcdxcache-3.2.0./configure --with-php-config=/usr/local/php/bin/php-config --enable-..._php xcache扩展

linux解压war包的命令-程序员宅基地

文章浏览阅读203次。网上很多人说用jar包解压,但jar命令解压时不能指定目录,推荐使用unzip解压war包。unzip -d 指定目录[root@oracle upload]# unzip -oq common.war -d common命令名: unzip功 能说明:解压缩zip文 件语  法:unzip [-cflptuvz][-agCjLMnoqsVX][-P &..._linux解压war包命令到指定目录

RTSP基本概念_rtcp alg-程序员宅基地

文章浏览阅读693次。流媒体指的是在网络中使用流技术传输的连续时基媒体,其特点是在播放前不需要下载整个文件,而是采用边下载边播放的方式,它是视频会议、IP电话等应用场合的技术基础。RTP是进行实时流媒体传输的标准协议和关键技术,本文介绍如何在Linux下利用JRTPLIB进行实时流媒体编程。一、流媒体简介 随着Internet的日益普及,在网络上传输的数据已经不再局限于文字和图形,而是逐渐向声音和视频等_rtcp alg

Java 比较两个字符串的相似度算法(Levenshtein Distance)_java中文字符串相似度算法-程序员宅基地

文章浏览阅读9.8k次,点赞10次,收藏35次。Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。算法实现原理图解:a.首先是有两个字符串,这里写一个简单的 abc 和 abeb.将..._java中文字符串相似度算法

CSS 文本对齐_css 标题和第一行对齐-程序员宅基地

文章浏览阅读1k次。text-align 水平对齐 right left centervertical-align 垂直对齐 top middle bottom属性:AbsBottom 图像的下边缘与同一行中最大元素的下边缘对齐。 AbsMiddle 图像的中间与同一行中最大元素的中间对齐。 Baseline 图像的下边缘与第一行文本的下边缘对齐。 Bottom 图_css 标题和第一行对齐

git配置user.name和user.email-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏5次。github在统计提交的时候,会判断邮箱是否跟github的登陆邮箱匹配,不匹配则不计算活跃度,即不生成小绿块。查看配置git config user.emailgit config user.name设置当前仓库的user.name/user.emailgit config user.email yourEmailNamegit config user.name yourName设置全局user.name/user.emailgit config --global use._user.name

推荐文章

热门文章

相关标签