老铁们,大家好,相信还有很多朋友对于Android开发攻略:深入浅出Broadcast Receiver使用技巧和的相关问题不太懂,没关系,今天就由我来为大家分享分享Android开发攻略:深入浅出Broadcast Receiver使用技巧以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!
本地广播Local Broadcast:App内广播可以理解为本地广播的一种。广播的发送者和接收者属于同一个App。与全局广播(普通广播)相比,应用内广播的优点是:安全性高、效率高。 LocalBroadcastManager发送的应用内广播只能通过LocalBroadcastManager动态注册,不能静态注册。调用sendBroadcast进行发送。
4、注册广播接收 (静态和动态)
4.1两种注册方法的区别
动态注册的接收器只有在节目启动后才能收到广播;即使节目未启动,静态注册的接收器也可以接收广播。例如,如果您想在手机开机后接收系统发送的广播。广播只能静态注册。
4.2静态注册具体步骤
静态注册:将广播写入AndroidMainifest.xml文件中。其特点是:驻留在系统中,不受组件生命周期的影响。即使应用程序退出,仍然可以接收广播,消耗电量和内存。第一步:创建一个继承的BroadcastReceiver,然后重写onReceive()的具体实现。由于生命周期短,耗时的工作应该发送给Service,onReceive()不应该开启子线程。公共类MyReceiver 扩展了BroadcastReceiver {
//onReceive不能做太多耗时的操作。如果10秒内没有响应,就会发生ANR。
公共无效onReceive(上下文上下文,意图意图){
Toast.makeText(context, "启动完成", Toast.LENGTH_SHORT).show();
}
}第二步:在AndroidMainifest.xml中添加,在子标签intent-filter中添加需要监听的action。 Exported属性表示是否允许该广播接收本节目之外的广播,Enabled属性表示是否启用广播接收器。
4.3 动态注册
动态注册: 自定义类继承BroadcastReceiver,然后重写onReceive()的具体实现。代码中调用registerReceiver()注册广播。 unregisterReceiver()方法必须在onDestroy中调用,否则会导致内存泄漏。特点是:不是永久的,跟随组件寿命的变化,组件结束,广播结束。在组件结束之前,需要去掉广播,否则很容易造成内存泄漏。受保护无效onCreate() {
myBroadcastReceiver ChangeReceiver=new myBroadcastReceiver();
IntentFilterintentFilter=new IntentFilter();
IntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
注册接收器(ChangeReceiver,intentFilter);
}
//在onDestroy()中取消注册,否则会导致内存泄漏。
受保护无效onDestroy() {
取消注册接收器(networkChangeReceiver);
}
//ChangeReceiver是收到后会发生什么
类myBroadcastReceiver 扩展BroadcastReceiver {
公共无效onReceive(上下文上下文,意图意图){
//要做的事
}
}
5、广播的发送
1.标准广播(异步)
//通过sendBroadcast发送标准家庭广播
Intent意图=new Intent("com.example.songsong.MY_BROADCAST");
发送广播(意图);
2.有序广播(同步)
定义:发送的广播由广播接收器按照接收顺序接收。接收广播的顺序规则(对于静态和动态注册的广播接收者都适用)按照Priority属性值从大到小排序;优先级属性相同的,动态注册的广播优先;特点:按顺序接收广播;先接收到的广播接收者可以截断该广播,即后接收到的广播接收者将不再接收到该广播;第一个接收到的广播接收者广播可以被修改,那么后续的广播接收者就会接收到通过sendOrderBroadcast发送的修改后的广播
Intent意图=new Intent("com.example.songsong.MY_BROADCAST");
sendOrderBroadcast(intent,null);/*设置广播接收者的优先级*///广播接收者截断:
公共无效onReceive(上下文上下文,意图意图){
中止广播();
}
3.本地广播
//发送1:实例化localBroadcastManager
LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(this);
//发送2:发送广播
Intent意图=new Intent("android.net.conn.CONNECTIVITY_CHANGE");
localBroadcastManager.sendBroadcast(意图);
//接收1:实例化IntentFilter和接收者LocalReceiver
IntentFilterintentFilter=new IntentFilter();
LocalReceiver localReceiver=new LocalReceiver();
//接收2:设置广播接收类型
IntentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//接收3:动态注册本地广播
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
//接收4:在onDestroy中取消注册
localBroadcastManager.unregisterReceiver(localReceiver);
//接收5:继承localReceiver中的BroadcastReceiver,并重写onReceiver。
.
6.广播内部实现机制
自定义广播接收器BroadcastReceiver并重写onRecvice();通过Binder机制将广播注册到AMS(Activity Manager Service);通过Binder机制将广播发送给AMS(Activity Manager Service)。 AMS找到满足相应条件(IntentFilter/Permission等)的BroadcastReceiver,并将广播发送到BroadcastReceiver所在的消息循环队列中。 BroadcastReceiver所在的消息队列得到这个广播后,会回调它的onReceive()方法。
7.AMS 是什么?
AMS(Activity Manager Service):是贯穿Android系统组件的核心服务,负责启动四大组件启动切换调度。
8.本地广播 LocalBroadcastManager
背景:Android中的广播可以直接跨App通信(有intent-filter时exported的默认值为true)
冲突:
其他App专门发出与当前App的intent-filter匹配的广播,导致当前App不断接收并处理广播;其他App注册与当前App一致的intent-filter来接收广播并获取具体的广播信息(即出现安全和效率问题)。解决方案:使用App内广播(本地广播)
App内广播可以理解为局部广播的类型。广播的发送者和接收者属于同一个App。与全局广播(普通广播)相比,应用内广播的优点是:安全性高、效率高;特点:
发送的广播只能在自己的App内部传递,不会泄露给其他App,保证隐私数据不会泄露;广播接收者只能接收本App的广播;其他应用程序无法将广播发送到您的应用程序。不用担心其他应用程序来造成损坏;比系统的全局广播更有效率。内部实现原理:
LocalBroadcastManager之所以高效,主要是因为它内部是通过Handler实现的,其sendBroadcast()方法是通过handler()发送Message来实现的。相比通过Binder进行系统广播,本地广播会更加高效。其他App无法向您自己的App发送广播,您自己的App发送的广播也不会离开您自己的App。 LocalBroadcastManager内部协作主要依赖两个Map集合:mReceivers和mActions,当然还有一个List集合mPendingBroadcasts,它主要存放要接收的广播对象。
9.全局广播的缺点
App被反编译获取Actions后,会被植入广告,导致数据泄露。
10.BroadcastReceiver 和 LocalBroadcastReceiver 区别
BroadcastReceiver是跨应用广播,使用Binder机制实现。LocalBroadcastReceiver是应用内广播,使用Handler实现,并利用IntentFilter的match功能提供消息发布和接收功能,实现应用内高效率的通信。
11.Broadcast Receiver能在onReceive中执行耗时任务吗?
如果BroadcastReceiver在10秒内没有完成执行,Android会认为程序无响应ANR,因此无法在onReceive中启动线程,通常通过service或IntentService来处理。
12.BroadCastReceiver 的生命周期
广播接收器的生命周期很短。它在接收到广播时创建,在onReceive()方法结束后销毁; b.不要在广播接收器中做一些耗时的工作,否则会弹出Application No。响应应用程序没有响应对话框; c.最好不要在广播接收器中创建子线程来做耗时的工作,因为广播接收器销毁后,进程就变成空进程,很容易被系统杀死; d.长期耗时的工作最好在服务中完成;
13.广播传输的数据是否有限制,是多少,为什么要限制?
Broadcast通过Intent传输数据,Intent的数据大小限制在1MB以内。如果大于或等于1MB,就会出现异常。
Intent携带的信息大小实际上受到Binder的限制。 Binder传递缓存的大小是有限的,通常为1Mb。但同一进程中的所有传输共享缓存空间。当多处传输时,即使传输的数据没有超过大小限制,也可能会抛出TransactionTooLargeException。
Android开发攻略:深入浅出Broadcast Receiver使用技巧的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、Android开发攻略:深入浅出Broadcast Receiver使用技巧的信息别忘了在本站进行查找哦。
【Android开发攻略:深入浅出Broadcast Receiver使用技巧】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学安卓开发,一直都想了解Broadcast Receiver的工作原理,这个笔记真及时!
有7位网友表示赞同!
终于找到一篇关于 Broadcast Receiver 的详细笔记了!
有7位网友表示赞同!
感觉学习 Android 开发离不开 Broadcast Receiver 这个东西,这篇笔记分享的太好了!
有6位网友表示赞同!
我需要用到 Broadcast Receiver 来实现一些自定义功能,这篇文章很实用。
有17位网友表示赞同!
作为安卓开发初学者,我一直有点迷茫面对广播接收器的使用,这篇笔记帮我理清思路了!
有17位网友表示赞同!
看懂这篇文章后,对 Broadcast Receiver 的理解程度一下子提高了很多!
有17位网友表示赞同!
希望能看到更多关于 Android 开发的实战笔记,比如使用 Broadcast Receiver 的实际案例。
有20位网友表示赞同!
以前我一直把广播接收器当成一个黑盒子,现在终于知道它是怎么工作的!
有9位网友表示赞同!
这篇文章讲解得很清晰,即使是对安卓开发不太熟悉的同学也能读懂。
有5位网友表示赞同!
Android 开发学习的路上,笔记真是太宝贵了! 这份关于 Broadcast Receiver 的笔记非常棒!
有13位网友表示赞同!
这篇笔记分享的好,让我快速 grasp 了 Broadcast Receiver 的核心概念!
有6位网友表示赞同!
以后遇到什么 Android 相关的知识点,希望作者能继续写一些详细的学习笔记分享。
有12位网友表示赞同!
学习 Android 开发需要不断地积累经验,阅读这样的笔记可以帮助我更快入门!
有15位网友表示赞同!
这篇文章不仅讲解了 Broadcast Receiver 的原理,还提供了一些编程实例,非常实用!
有14位网友表示赞同!
看来学 Android 开发真是要学到广播机制的知识! 这篇笔记太重要啦!
有5位网友表示赞同!
我很喜欢这种简洁明了的学习风格,希望以后还能看到更多这样的笔记!
有7位网友表示赞同!
安卓开发真的涉及的内容很多,幸好有这样好的学习资源可以参考。
有8位网友表示赞同!
这篇文章让我对 Android 知识体系有了更清晰的认识。
有14位网友表示赞同!
学习技术确实需要不断地巩固和实践,这篇笔记帮我加深了 Broadcast Receiver 的理解!
有11位网友表示赞同!