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拨号等功能,明白上面的话实现起来就轻而易举了。
分享到:
相关推荐
粘性广播允许发送者在广播完成后保留最后一个发送的Intent。当新的Receiver注册并监听该广播时,它会立即收到最近的Sticky Intent。然而,由于Sticky广播可能消耗内存,因此在Android O及以上版本,系统不再支持...
注意,从Android O开始,系统限制了对粘性广播的使用。 四、广播的生命周期与安全 由于广播接收器没有明显的生命周期,因此需要注意在不再需要时及时取消注册,避免资源浪费。另外,为了提高系统的安全性,应该...
理解并掌握广播接收者的使用是Android开发中的关键技能之一。 **广播接收者的注册** 1. **静态注册**:在AndroidManifest.xml文件中声明广播接收者,这种方式的广播接收者在系统启动时就会被创建,即使应用没有运行...
为了替代粘性广播和有序广播,Android Oreo引入了BroadcastChannel。BroadcastChannel提供了一种在应用程序内发送有序且私有的广播方式,避免了对系统广播的滥用。 总结,Android的广播技术是其组件间通信的重要...
2. **发送广播**: 调用sendBroadcast()、sendOrderedBroadcast()或sendStickyBroadcast()方法,根据需求选择发送有序或无序广播,或粘性广播。 **四、广播接收者的实现** 1. **定义BroadcastReceiver**: 创建...
总结,Android的Broadcast机制为开发者提供了灵活的事件传递方式,理解和熟练运用BroadcastReceiver能极大地提升应用的交互性和功能完整性。不过,随着Android系统的更新,对于Broadcast的使用也需关注其在后台运行...
** Sticky Broadcast**(粘性广播) 这是一种特殊的有序广播,即使当前没有接收者,系统也会保存这个广播Intent,直到有新的接收者出现。使用`sendStickyBroadcast(Intent)`发送,通过`getStickyBroadcast(Intent)`...
前两者用于发送非粘性广播,后者发送的广播在所有接收者处理完后仍会保留在系统中,直到被清除。 6. **权限管理**:对于一些敏感的广播,如开机启动、安装卸载应用等,需要在AndroidManifest.xml中声明相应的权限...
`StickyBroadcast`(粘性广播)是广播的一种特殊类型,它允许发送者将广播意图(Intent)留在广播接收器(BroadcastReceiver)的注册池中,即使在广播发送后,新的接收器也能获取到之前发送的广播数据。本示例(...
4. 发送广播通常通过Intent对象,使用Context的sendBroadcast()、sendOrderedBroadcast()或send Sticky Broadcast(粘性广播)等方法。发送广播时,可以在Intent中添加额外数据,以便接收者处理。 ```java Intent ...
- **send StickyBroadcast(Intent)**: 粘性广播,即使广播发送后没有接收者,也会保留在系统中,直到有新的BroadcastReceiver注册并接收。 4. **权限控制**: - 某些广播,如关于系统级别的事件(如开机、网络...
2. 粘性广播:通过sendStickyBroadcast()发送的广播,会在发送后继续存在,直到有接收者处理它。这种方式适用于需要保持广播状态的场景。 五、限制与优化 1. 电池优化:从Android O开始,对后台运行的...
总结,理解并掌握Android的广播机制对于开发人员来说至关重要,它能够帮助你实现跨组件通信、响应系统事件,同时也要注意合理使用以避免性能问题。通过学习和实践,你可以根据项目需求灵活运用广播机制,为应用程序...
### Android广播机制与权限详解 #### 一、广播机制简介 在Android开发中,广播(Broadcast)是一种消息传递机制,用于应用...希望这些信息能帮助开发者更好地理解和运用广播机制,从而提高应用的健壮性和用户体验。
但请注意,由于安全和性能原因,在Android O及以后的版本,系统不再支持粘性广播。 通过"BroadcastTest29"这样的实验项目,开发者可以学习如何创建、发送和接收各种类型的广播,理解广播的工作原理,以及如何在实际...
3. **onSendStickyBroadcast(View v)**:发送粘性广播,即使在广播发送后,新的BroadcastReceiver依然可以获取到上一次发送的Intent。需要在`AndroidManifest.xml`中声明对应的权限。 **三、接收广播** 当...
总结,Android的广播事件处理是其组件通信的重要方式之一,理解并熟练掌握广播机制能够帮助开发者实现更灵活的事件响应和应用间的交互。通过创建和注册BroadcastReceiver,结合不同的广播类型和发送方法,我们可以...
这种方式适用于需要持久保存广播数据的情况,但出于性能和安全考虑,从Android O(8.0)开始,系统限制了对粘性广播的使用,开发者应尽量避免使用。 在"BroadcastReceiverDemo"项目中,我们可以看到以下关键步骤: ...
其中,有序广播(ordered broadcast)可以按照接收器的优先级顺序依次处理,而粘性广播(sticky broadcast)会在发送后保留,直到有新的广播覆盖它。 2. **接收广播**:在`onReceive()`方法中处理接收到的广播,...
3. Sticky Broadcast:粘性广播,当最后一个接收者处理完广播后,该广播Intent会留在系统中,直到有新的广播发送过来覆盖它。 四、广播最佳实践 1. 避免在onReceive()中执行耗时操作:因为BroadcastReceiver生命...