BroadcastReceiver,作为一个广播接收者,因为android组件之间消息的传递基于intent,所以广播接收者想要接收什么类型的广播,将receiver标签下的intent-filter标签下的action标签的值置为那个广播类型即可,如
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
上面这段代码其实就注册了两个广播接收的类型,系统开机启动完成时的广播和短信到来的广播(注意加上短信接受权限)都会被接收到,然后可以再onReceive()方法里面写上你想写的代码了。
额外提个事,权限问题一定要加上,现在的logcat里面Permission denied的提示都不是红色的了,改成橙色的,我还以为我这没出问题,找了半天代码的问题,结果后来还是发现权限配错了,本来想拦截拨出的电话的,结果没配权限怎么都拿不到数据啊,找了十几分钟。虽然相对前些天我找一个上午的权限问题进步多了,但是我还是这么认为,玩android权限问题都要找个十来分钟的话那就太2了。
除了在清单文件中配置以外,也可以在代码中订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
Receiver receiver = new Receiver();
registerReceiver(receiver, filter);
Receiver是你自己写的继承自BroadcastReceiver的类。IntentFilter就对应着Action啦。
还有一个细节是sendBroadcast的三种发送方法。
sendBroadcast(),sendOrderedBroadcast()和
sendStickyBroadcast()sendBroadcast()这个方法的广播是能够发送给所有广播接收者,按照注册的先后顺序,如果你这个时候设置了广播接收者的优先级,优先级如果恰好与注册顺序相同,则不会有任何问题,如果顺序不一样,会出leaked IntentReceiver 这样的异常,并且在前面的广播接收者不能调用abortBroadcast()方法将其终止,如果调用会出BroadcastReceiver
trying to return result during a non-ordered broadcast的异常,当然,先接收到广播的receiver可以修改广播数据。
sendOrderedBroadcast()方法顾名思义就是priority的属性能起作用,并且在队列前面的receiver可以随时终止广播的发送。还有这个api能指定final的receiver,这个receiver是最后一个接收广播时间的receiver,并且一定会接收到广播事件,是不能被前面的receiver拦截的。实际做实验的情况是这样的,假设我有3个receiver依序排列,并且sendOrderedBroadcast()方法指定了一个finalReceiver,那么intent传递给这4个Receiver的顺序为Receiver1-->finalReceiver-->Receiver2-->finalReceiver-->Receiver3-->finalReceiver。这个特性可以用来统计系统中能监听某种广播的Receiver的数目。
sendStickyBroadcast()字面意思是发送粘性的广播,使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,10秒限制是指普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
下面是广播接收者的生命周期以及一些细节部分:
1.广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2.广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3.最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4.耗时的较长的工作最好放在服务中完成
至于广播接收者接收用户的短信,实现ip拨号等功能,明白上面的话实现起来就轻而易举了。
分享到:
相关推荐
android粘性控件
Android上贝塞尔曲线实现粘性动画,类似QQ未读。其中也有贝塞尔曲线的入门实例。 博客地址:http://blog.csdn.net/savelove911
仿QQ消息提醒小红点拖拽粘连效果。
QQ5.0新特效,未读提醒的粘性控件。虽然看起来可能是一个很小的控件,但是考量到的知识点却很多哦!
这是一个带有“粘性”功能的viewpager。 ViewPager带有粘性功能,常规的处理方法可能会超级复杂,因为涉及到大量的onTouch监听、拦截,滑动时因为效率问题影响用户体验,不信你去看一下应用宝、豌豆荚的App详情页,...
android粘性控件.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
主要为大家详细介绍了Android自定义StickinessView粘性滑动效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 仿QQ未读消息拖拽删除粘性效果
具有粘性的Scrollview的Android Studio Demo。
Metaball-Menu A menu consisting of icons (ImageViews)...Metaball Loading by Dodola - Thanks for the Path draw functions on Android PaperJS Metaball Example Calvin Metcalf LICENSE The MIT License (MIT)
Android Gooview 一个自定义粘性控件,拖动GooView,在一定的范围内具有粘性效果,当超出范围时,GooView消失。 Sample usage A sample project which provides runnable code examples that demonstrate uses of ...
一份详细的RecyclerView.ItemDecoration实现分组粘性头部的Demo,看了就懂!
本篇文章主要给大家分享了一个安卓的头部效果ScrollView粘性头部代码分享,有兴趣的朋友参考学习下。
Android EventBus使用,粘性事件postSticky使用 https://blog.csdn.net/qq_31939617/article/details/80860615
ViewPager带有粘性功能,常规的处理方法可能会超级复杂,因为涉及到大量的onTouch监听、拦截,滑动时因为效率问题影响用户体验,不信你去看一下应用宝、豌豆荚的App详情页,然后滑动一下试试。
path 视差特效,侧滑删除,粘性控件
主要为大家详细介绍了Android实现Recycleview悬浮粘性头部外加右侧字母导航,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
有趣的粘性侧滑条目
Android库提供带有气泡形式选项的粘性侧面菜单。 SideBubbles Android库提供带有气泡形式选项的粘性侧面菜单。 安装:hammer_and_wrench:Gradle将其添加到存储库末尾的root build.gradle中:allprojects {存储库{... ...
提供粘性索引和快速滚动用户界面组件