Android_5_Broadcast

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,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。
注意:当广播接收者执行超过10s程序就会出现ANR,所以最好不要在广播接收者中进行过于耗时的操作,当onRecieve()方法结束,广播接收者的执行就可以说结束了
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值