Android发送广播与接收广播

本文介绍了Android中如何发送无序和有序广播,包括sendBroadcast()和sendOrderedBroadcast()方法,以及如何携带数据。同时,讨论了如何区分和处理有序广播与无序广播,特别指出只有在onReceive()中调用abortBroadcast()才能终止有序广播的传递。最后,文章提到了静态和动态注册广播接收者,静态注册在程序发布后即可接收广播,而动态注册通常在Activity启动时进行并在关闭时注销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以通过发送广播传送数据 

1.发送无序广播,调用sendBroadcase(intent) 即可,给 intent 设置 action ,也可以携带数据

	public void sendbroadcast(View  v){
		Intent intent=new Intent();
		intent.setAction("com.wanhao");
		sendBroadcast(intent);
	}
接收广播时,同一手机上的任何注册了广播接收者,指定了对应action就可以接收广播,与接收系统广播别无二致。

        <receiver  android:name="com.Receiver">
            <intent-filter>
                <action     android:name="com.wanhao"/>
            </intent-filter>
        </receiver>
2.发送有序的广播。
可以指定收到广播的顺序。

先指定发送广播者:

	public void sendbroadcast(View  v){
		Intent intent=new Intent();
		intent.setAction("com.wanhao.sendrice");
		//收到广播时,需要的权限
		String receiverPermission=null;
		//广播最后的接收者
		BroadcastReceiver resultReceiver = new FinalReceiver();
		//处理最终的广播接收者用到的handler 传入null,会在主线程处理
		Handler scheduler=null;
		//初始化的数据
		String initialData="everyone will get 1 ton;";
		Bundle initialExtras=null;
		int initialCode = Activity.RESULT_OK;
		sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
	}
其中resultReceiver 也在发送广播的程序中指定,可以处理最后一次数据(不必在AndroidManifest.xml中配置receiver)

public class FinalReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		String result=getResultData();
		Toast.makeText(context,"Final:"+ result, Toast.LENGTH_SHORT).show();
	}
}

然后是接收者,

第一个接收者:

	@Override
	public void onReceive(Context context, Intent intent) {
		String result=getResultData();
		Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
		setResultData("everybody 0.9 ton");
	}
第二个接收者

	@Override
	public void onReceive(Context context, Intent intent) {
		String result=getResultData();
		Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
		setResultData("everybody 0.7 ton");
		//终止有序广播的向下传递
		//abortBroadcast();
	}
第三个接收者
	@Override
	public void onReceive(Context context, Intent intent) {
		String result=getResultData();
		Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
		setResultData("everybody 0.5 ton");
	}
第四个接收者

	@Override
	public void onReceive(Context context, Intent intent) {
		String result=getResultData();
		Toast.makeText(context, result, Toast.LENGTH_SHORT).show();
	}
最后每个receive在清单文件中配置,并设置优先级

<receiver android:name="com.wanhao.StateReceiver">
            <intent-filter android:priority="1000">
                <action android:name="com.wanhao.sendrice"/>
            </intent-filter>
        </receiver>
        <receiver android:name="com.wanhao.CityReceiver">
            <intent-filter android:priority="900">
                <action android:name="com.wanhao.sendrice"/>
            </intent-filter>
        </receiver>   
        <receiver android:name="com.wanhao.TownReceiver">
            <intent-filter android:priority="800">
                <action android:name="com.wanhao.sendrice"/>
            </intent-filter>
        </receiver>     
        <receiver android:name="com.wanhao.FamersReceiver">
            <intent-filter android:priority="700">
                <action android:name="com.wanhao.sendrice"/>
            </intent-filter>
        </receiver>  

发送有序广播还有种比较简单的方式,sendOrderedBroadcase(intent ,receivePermission);可以让 intent 携带数据,第二个参数表示收到广播需要的权限。

如何区分有序广播和无序广播,在onReceive方法中调用abortbroadcase(); 若是无异常,表示可以终止广播传递,为有序广播,反之为无序广播。

比较有序广播与无序广播


3.特殊广播接收者

四大组件只有广播接收者可以不在清单文件中注册

静态注册:当程序发布到设备上,会解析下 receiver 以及 action ,正常情况下,发下来就会接收到。

动态注册:解锁等频繁使用广播,在activity启动时注册,关闭时注销

注册接收者 registerReceiver(receiver,filter);

注销接收者 unregisterReceiver(receiver)

	private	BroadcastReceiver receiver;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//广播接收者对象
	    receiver=new DynasticReceiver();
		//意图过滤器对象
		IntentFilter filter=new IntentFilter();
		filter.addAction("android.intent.action.SCREEN_ON");
		filter.addAction("android.intent.action.SCREEN_OFF");
		//动态注册一个广播接收者
		registerReceiver(receiver,filter);
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		//动态注册的广播接收者 在当前activity结束时,一定要注销掉receiver广播接收者(unregisterReceiver)
		unregisterReceiver(receiver);
	}
receiver:

public class DynasticReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		if("android.intent.action.SCREEN_ON".equals(intent.getAction())){
			System.out.println("屏幕开启!");
		}else if("android.intent.action.SCREEN_OFF".equals(intent.getAction())){
			System.out.println("屏幕关闭!");
		}
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值