`

Android技术点记录-BroadcastReceiver

 
阅读更多

一、相关概念

1、BroadcastReceiver

       BroadcastReceiver是全局监听器,用于监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信

2、BroadcastReceiver的生命周期

       与Service、Activity具有完整的生命周期不同,BroadcastReceiver本质上只是一个系统级的监听器,负责监听各程序所发出的Broadcast。

3、BroadcastReceiver的编码实现方式

      a、编写类,继承BroadcastReceiver

      b、AndroidManifest.xml中配置receiver ,此时自动完成注册;手动注册,使用registerReceiver()

      c、调用BroadcastReceiver:

              sendBroadcast(intent)   或者   sendOrderedBroadcast(intent2, null)

4、有序广播

      普通广播:

      普通广播是完全异步的,可以在逻辑上的同一时刻被所有接受者接收到,消息传递的效率很高。但缺点是接受者不能将处理结果传递给下一个接受者,并且无法终止BroadcastReceiver Intent的传播。

      有序广播:

      Ordered Broadcast的接收者按照预先声明的优先级依次接收Broadcast。

      优先级 -1000到1000,数值越大优先级越高,在xml中通过priority或者编码setPriority设置;

      通过sendOrderedBroadcast(intent2, null)启动有序广播;

      在前一个BroadcastReceiver中设置处理结果通过setResultExtras(bundle)实现;

      在后一个BroadcastReceiver中,通过Bundle bundle=getResultExtras(true);获取前面的处理结果;

      通过abortBroadcast();取消继续广播

     

 二、编码实现

activity中定义按钮点击事件,点击时发送广播	
@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.btn_broad0:
			Intent intent=new Intent("com.example.receiver.MyBroadcastReceiver");
			intent.putExtra("data", "我是数据"+new Date().toLocaleString());
			sendBroadcast(intent);
			break;
		case R.id.btn_broad1:
			Intent intent2=new Intent("com.example.receiver.MyOrderedReceiver");
			intent2.putExtra("data", "我是数据"+new Date().toLocaleString());
			sendOrderedBroadcast(intent2, null);
			break;
		default:
			break;
		}
	}

 

 

普通广播接收
public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Toast.makeText(context,intent.getExtras().getString("data").toString(), Toast.LENGTH_SHORT).show();
	}

}

 

有序广播接收者1
public class MyOrderedReceiver1 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Bundle bundle=intent.getExtras();
		Toast.makeText(context, "receiver1"+bundle.getString("data").toString(), Toast.LENGTH_SHORT).show();
		bundle=new Bundle();
		bundle.putString("data2", "我是新数据");
		//设置处理结果数据,级别低的BroadcastReceiver可以接收
		setResultExtras(bundle);
	}

}

 

有序广播接收者2
public class MyOrderedReceiver2 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//获取前面BroadcastReceiver的处理结果
		Bundle bundle=getResultExtras(true);
		Toast.makeText(context, "receiver2"+bundle.getString("data2").toString(), Toast.LENGTH_SHORT).show();
		abortBroadcast();//取消继续广播
	}

}

 

        <receiver android:name="com.example.receiver.MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="com.example.receiver.MyBroadcastReceiver" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.receiver.MyOrderedReceiver1" >
            <intent-filter android:priority="10">
                <action android:name="com.example.receiver.MyOrderedReceiver" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.example.receiver.MyOrderedReceiver2" >
            <intent-filter android:priority="1">
                <action android:name="com.example.receiver.MyOrderedReceiver" />
            </intent-filter>
        </receiver>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics