Broadcast(广播)
在Android中,Broadcast是一种广泛运用的在应用程序之间以及进程间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。
首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过发送无序广播 Context.sendBroadcast()、有序广播sendOrderBroadcast()或粘性广播sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送以后,对应已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
广播是Android组件间的通信方式的一种,一般系统会发送很多广播,当有需要时可以接收系统的广播,同时当我们需要让其他组件做事时,也可以给对应的组件发送广播.
Android广播分为两个方面:发送者和接收者,通常情况下,BroadcastReceiver指的就是广播接收者.
可以使用的场景如下:
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);
2.同一app内部的不同组件之间的消息通信(单个进程);
3.同一app具有多个进程的不同组件之间的消息通信;
4.不同app之间的组件之间消息通信;
5.Android系统在特定情况下与App之间的消息通信。
定义广播接收者:
一.静态广播接收者(在清单文件中声名广播,应用生效广播生效不能被反注册)
1.自定义类继承自BroadCastReciver
public class Revicer extends BroadcastReceiver {
}
2.复写 onReceive(Context context, Intent intent) 方法在定义自己要的操作
@Override
public void onReceive(Context context, Intent intent) {
Log.e("icechao","手机已开机,接收到开机广播");
}
3.注册广播接收者,(有两种方式,要看具体使用场景来使用)
(1).由系统到调用起的广播接收者,当有对应的广播发生时就会调用onReceive方法
<receiver android:name=".Revicer">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
(2).代码中注册广播接收者,当我们不需要时可以手动把这个接收者结束
IntentFilter intentFilter = newIntentFilter(Intent.ACTION_BOOT_COMPLETED);
Revicer revicer = new Revicer();
registerReceiver(revicer,intentFilter);
静态注册的广播不能反注册,只是通过条件判断终止广播执行
二. 动态注册广播(广播在代码中进行注册和取消)
context.registerReceiver
这个方法是定义在Context中的也就是说,当要启动服务时必须要先有一个Context对象,同时当在代码中手动注册广播时,在不使用时可以使用unRegistReceiver把广播接收者取消
unregisterReceiver(revicer);
当在代码中动态注册广播时需要保留这个广播的对象,当需要反注册这个广播时需要使用这个对象
要注意的是在接收的系统的广播时,要在menifet中声名对应的权限否则不能接收到广播
广播几种类型
一. 无序广播
广播接收者,接收到这个广播没有固定的先后顺序
通过Context.sendBroadcast()方法来发送,它是完全异步的。所有的receivers
(接收器)的执行顺序不确定,因此所有的receivers(接收器)接收broadcast的顺序不确定。
二. 有序广播
广播接收者,在注册时指定优先级,优先级高的接收者先接收到广播
Context.sendOrderedBroadcast来发送
BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,
通过getResult系列函数来取得上个BroadcastReceiver返回的结果,
并可以abort系列函数来让系统丢弃该广播,使用该广播不再传送到别的BroadcastReceiver。
例:
<receiver android:name=".SmsReceiver">
<intent-filter android:priority="100">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
三. 粘性广播
广播不会在被接收后停止,会持续
Context.sendStickyBroadcast()发送粘性的广播
使用这个api需要权限android.Manifest.permission.BROADCAST_STICKY,
粘性广播的特点是Intent会一直保留到广播事件结束,而这种广播也没有所谓的10秒限制,
10秒限制是指广播如果onReceive方法执行时间超过10秒,系统会将这个广
播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
网友评论