BroadCast Receiver 详解

这里是引用,本文主要是《第一行代码》阅读笔记!由于刚开始学习Android,所以肯定有很多见解不成熟。希望看到的人能多多指正,有问题的地方可以提在评论,多谢赐教!

       BroadcastReceiver,广播接收者。Android四大组件之一,它的本质就是一个全局的监听器。可以监听到各种广播,包括系统广播、应用广播。可以用来实现不同组件之间的通信。
       在Android中,广播可以分为两大类:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)。
标准广播:一种异步执行的广播,在广播发出后所有的接收者几乎是同一时间接收到广播。这种广播效率很高,但是没有先后顺序所以一位置不能被截断。
有序广播:一种同步执行的广播,在广播发出后优先级最高的广播接收器可以接收到这条广播,当这个广播接收器中的逻辑执行完成以后,广播才会继续传递。因此如果在优先级高的广播接收器中截断了正在传递的广播,那么后面的广播接收器就无法接收到这条广播。

发送广播的基本步骤:

1.创建需要启动BroadCastReceiver的Intent
2.调用Context的sendBroadcast()方法或者sendOrderedBroadcast()方法发送广播。其中sendBroadcast()发送的是标准广播,sendOrderedBroadcast()发送的是有序广播。
标准广播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_BROADCAST");
sendBroadcast(intent);

有序广播

Intent intent = new Intent("com.zwf.broadcastdemo.MY_ODERED_BROADCAST");
sendOrderedBroadcast(intent, null);
接收广播的基本步骤:

我们可以接收自定义的广播,也可以接收系统的广播。系统会发出很多广播,例如开机启动完成,电量过低等都会发出广播,但是想接收这些广播需要声明权限。

1.创建一个类继承自BroadCastReceiver,重写父类的onReceive()方法。这样当消息来了,就会执行onReceive()方法中的逻辑。
2.注册BroadcastReceiver,实现了BroadcastReceiver需要注册一下,有两种方式:

  • 动态注册:这种方法是通过java代码注册。这种注册方式注册的广播接收者为非驻型广播,它会随着Activity的生命周期变化,所以在Activity推出的时候我们需要调用unregisterReceiver(netWorkBroadCastReceiver)方法取消注册。下面是注册代码:
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
netWorkBroadCastReceiver = new NetWorkBroadCastReceiver();
registerReceiver(netWorkBroadCastReceiver, intentFilter);
  • 静态注册:这种方法是通过AndroidManifest.xml文件注册。通过这种方式注册的广播为常驻型广播,也就是说如果应用程序关闭了,有相应事件触发,程序还是会被系统自动调用运行。这样可以做到程序还没运行,就可以实现某个广播的接收注册,比如开机启动广播。
<!-- 静态注册广播接收者(此时的接收者不能是内部类) -->
<receiver android:name=".BootCompleteReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>
BroadCastReceiver的生命周期

这一块内容主要是参考的这位同学的博客,其实对于何时使用service还不是很了解。可能下一部分内容是看服务!

       BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。

特别是,您可能无法从一个BroadcastReceiver中显示一个对话框,或绑定到服务。对于前者,则应该使用NotificationManager的API。对于后者,你可以使用Context.startService()来启动一个Service。

本地广播

       前面所发送和接收的所用广播都属于系统的全局广播,我们发出的这些广播可以给系统中任何应用程序接收到,当然我们也可以接受其他应用程序的广播。但是,只用本地广播机制发出的广播只能在本应用程序中接收到。这样的话安全性得到了提升。本地广播机制主要是用LocalBroadcastManager来管理,它提供了发送广播的方法sendBroadcast()和sendBroadcastSync()(这也方法好像用的不多,我暂时没有深究,等以后真正用到可以查一下),注册接收者的方法registerReceiver(localReceiver, localIntentTilter),需要两个参数,取消注册的方法localBroadcastManager.unregisterReceiver(localReceiver);

下面看一下本地广播机制的工作流程:
1.发送本地广播

 //发送本地广播
localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取本地广播管理实例
localCastBtn = (Button) findViewById(R.id.local_btn);
localCastBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //发送本地广播
        Intent intent = new Intent("com.zwf.broadcastdemo.LOCAL_BROADCAST");
        localBroadcastManager.sendBroadcast(intent);
    }
});

2.注册广播接收者

//注册本地广播监听
localIntentTilter = new IntentFilter("com.zwf.broadcastdemo.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, localIntentTilter);

3.取消注册

//取消本地广播监听
localBroadcastManager.unregisterReceiver(localReceiver);

关于BroadCastReceiver就总结这么多,等以后实际项目用到的话知道有这么一个用法,其他再去查。有新记录会及时补充。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容