Android中的广播使用全解析

Broadcast是一种广泛运用的、在应用程序之间传输信息的机制,广播机制是一个典型的发布-订阅模式,也就是我们所说的观察者模式。通过这样的形式来达到接、收双方的完全解耦合。可使用EventBus框架替代广播的使用。

发送方和接收方不存在必然联系;BroadcastReceiver会堵塞主线程只有onReceive()结束,主线程才得以继续进行;每次广播到来时,会重新创建BroadcastReceiver对象,并且调用onReceive()方法,执行完以后该对象即被销毁当onReceive()方法在10秒内没有执行完毕,就会导致ANR。(程序无应答)

广播的分类:

  • 普通广播
  • 有序广播
  • 本地广播
  • 粘性广播

一、普通广播

1.自定义广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
	    /**逻辑操作**/
		System.out.println("收到了广播,进行了处理!!!");
	}
}
2.注册广播:
  • 静态注册
  • 动态注册

静态注册的广播接收器应用程序关闭后,仍在后台接收广播。在AndroidManifest.xml中注册receiver组件。

<receiver android:name=".MyBroadcastReceiver1" >
            //用来过滤掉该广播接收器不感兴趣的广播消息
            <intent-filter>	
                <action android:name="android.intent.action.EDIT" />
            </intent-filter>
</receiver>

动态注册的广播接收器Activity关闭后,广播接收器关闭。

public class TwoActivity extends Activity {
	// 过滤器
	private IntentFilter filter;
	// 广播接收器
	private MyBroadcastReceiver receiver;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.one);

		filter = new IntentFilter("android.intent.action.EDIT");
		receiver = new MyBroadcastReceiver();
		// 注册广播,并指定过滤器
		registerReceiver(receiver, filter);
	}
	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 取消广播注册
		unregisterReceiver(receiver);
	}
}
//自定义广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context arg0, Intent arg1) {
	    //过滤广播消息
	    if ("android.intent.action.EDIT".equals(action)) {
			/**逻辑操作**/
		    System.out.println("收到了广播,进行了处理!!!");
		}
	}
}
3.发送广播:
Context.sendBroadcast();

二、有序广播

发送的有序广播,被广播接收器接收的时候是有次序的接收,接收次序与receiver的intent-filter的android:priority属性有关,数值越大优先级越高,当广播接收到广播后可通过setResult()和getResult()分别设置向下个广播接收器传递数据,获取数据。

//设置优先级
<receiver android:name=".MyBroadcastReceiver1" >
            //用来过滤掉该广播接收器不感兴趣的广播消息
			//优先级数值为-1000~1000
            <intent-filter android:priority="100">	
                <action android:name="android.intent.action.EDIT" />
            </intent-filter>
</receiver>
//发送有序广播
Context.sendOrderedBroadcast()

三、本地广播(安全广播)

发送的非本地广播都是全局的,就是手机上其他应用的广播接收器也可能会收到(如果指定了相同的action)。为了解决这个问题在API21中引入了本地广播LocalBroadcastManager ,本地广播就是将发送的广播局限在该应用中,不被其他应用收到。

相关方法:

//注册广播
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, intentFilter);
//注销广播
LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
//发送本地广播
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent());
LocalBroadcastManager.getInstance(context).sendBroadcastSync(new Intent());

四、粘性广播

粘性广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器会收到此广播。粘性广播只保留最后一条广播,并且一直保留下去。简言之就是,在广播发送之后注册的广播接收器也会收到该广播。

添加权限:

<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
//发送粘性广播
context.sendStickyBroadcast(new Intent());

天行健,君子以自强不息;地势坤,君子以厚德载物。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值