android 发送有序广播sendOrderBraodCast、截断广播和广播之间的数据传递

本文深入探讨了Android应用中广播系统的有序广播原理,通过实例代码展示了如何利用有序广播实现消息的层级传递与拦截,以及如何在不同接收器之间传递数据,包括拦截广播、修改数据和数据的多级传递。

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

android中的广播分有序广播和无序广播,无序广播比较容易理解,有序广播是根据你在清单中为每个reciver设置priority的大小(越大优先级越高)将消息依次的传递(由高到低),

既然有了顺序就可以实现消息的一级一级的拦击,或者在某一级中,修改传递来的数据,发送到下一级。(例子:车载中的发送消息,例如1号车(最高指挥车)下达消息给2号车,2号车接受到消息之后,根据命令将消息详细化发给3号车(不一定是一个量车,有的车优先级可以相同))。

拦截可以使用abortBroadCast来拦截。数据的设置如果是原始广播发送过来的,可以使用intent.getStringExtra("msg")获得原始数据,你可以将新的数据使用setResultExtras()封装传递到下一级去(下一级接收getResultExtras(true)),也可以使用setResultData()封装数据发送到下一级(下一级使用getResultData接收)

示例代码:

package com.example.demoorderbroadcast;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

	private View btnSendOrderBroadCast;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
	}

	private void initView() {
		btnSendOrderBroadCast = this.findViewById(R.id.btn);
		btnSendOrderBroadCast.setOnClickListener(new MyOnclickListner());
	}
	private class MyOnclickListner implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if(btnSendOrderBroadCast==v){
				sendOrderBroadCast();
			}
		}
		
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}

	public void sendOrderBroadCast() {
		Intent intent=new Intent("com.pzf.mybroadcast");//清单文件中配置的
		intent.putExtra("msg", "ni hao ");
		sendOrderedBroadcast(intent, "com.pzf.permission");//receiverPermission:是自定义个权限
		
		
	}

}

package com.example.demoorderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyOrderBroadcastReciver extends BroadcastReceiver{

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String strMsg = intent.getStringExtra("msg");
		Log.e("pzf", "第一个:"+strMsg);
		Bundle extras=new Bundle();
		extras.putString("msg", "第一个界面传过来的"+strMsg);
		setResultExtras(extras); //继续向下川
		
	}
	
}

package com.example.demoorderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyOrderBroadcastReciverTwo extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
//		abortBroadcast();//开启此处,可以截断广播,不让它传到third中
		String strMsg = intent.getStringExtra("msg"); //获取广播的原始数据
		
		
		Log.e("pzf", "第二个:"+strMsg);
		Bundle extras=new Bundle();
		extras.putString("msg", "第二个界面传过来的"+strMsg);
		setResultExtras(extras); //继续向下川
		
		setResultData("第二个:"+strMsg); // "第二个:"+strMsg这是two中新的数据,传递到third中,在third中是用getResultData来获得setResultData("")中的数据
	}

}

package com.example.demoorderbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;

public class MyOrderBroadcastReciverThird extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String resultData = getResultData();//获取two中setResultData中的数据
		Bundle bundle = getResultExtras(true);//获取two中setResultExtras中的数据
		String bundleData = bundle.getString("msg", "");//获取two中setResultExtras()中的数据
		
		String strMsg = intent.getStringExtra("msg");//获取广播的原始数据
		Log.e("pzf", "第三个:"+strMsg);
		
		Log.e("pzf", "two中传到third新的数据:"+resultData);
		Log.e("pzf", "two中setResultExtras(extras)传到third新的数据:"+bundleData);
	}

}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.demoorderbroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
	<permission android:name="com.pzf.permission"
	    android:protectionLevel="normal"
	    ></permission>
	<uses-permission android:name="com.pzf.permission"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.demoorderbroadcast.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver 
            android:name="com.example.demoorderbroadcast.MyOrderBroadcastReciver"
            >
            <intent-filter 
                android:priority="1000"
                >
                <action android:name="com.pzf.mybroadcast"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        <receiver 
            android:name="com.example.demoorderbroadcast.MyOrderBroadcastReciverThird"
            >
              <intent-filter 
                android:priority="998"
                >
                <action android:name="com.pzf.mybroadcast"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </receiver>
        <receiver 
            android:name="com.example.demoorderbroadcast.MyOrderBroadcastReciverTwo"
            >
              <intent-filter 
                android:priority="999"
                >
                <action android:name="com.pzf.mybroadcast"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            
        </receiver>
        
        
    </application>

</manifest>



源码地址:

http://download.youkuaiyun.com/detail/pangzaifei/6939891


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值