43.android广播-有序广播

本文详细介绍了Android有序广播的工作原理,包括如何设置优先级、如何通过abortBroadcast()终止广播以及如何使用setResultData()来修改广播数据。

无序广播

没有顺序的广播,所有广播中的action匹配的广播可以收到这一条广播,并且是没有先后顺序,视为同时收到。abortBroadcast()拦截广播和setResultData()修改参数在无序广播里面是没有效果的。

有序广播:

没有顺序的广播,所有与广播action匹配的广播者都可以收到这一条广播,但是有先后的顺序,按照广播接受者的优先级接收。广播接收者需要提前设置优先级,优先级高的先接

收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当

A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);

//resultReceiver(new MyReceiver())不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后收到该广播,并且一定可以接收到,打电话的广播也是这种方式,无法拦截。
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每个人100元", null);

 

案例代码

app1:发送广播

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="发送文件" 
        android:onClick="click"
        />

</RelativeLayout>

MainActivity.java

package com.ldw.center;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    public void click(View v){
    	Intent intent = new Intent();
    	intent.setAction("com.ldw.sendcast");
    	
    	//发送有序广播
    	//resultReceiver(new MyReceiver())不需要在清单文件中配置,这个广播接收者只接受该条有序广播,并且是最后收到该广播,并且一定可以接收到
    	sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每个人100元", null);
    }
    
    //广播接收者对象,和app2里面不同的是,app2里面不需要定义,自动调用的接收者类,这里面需要定义这个类
    class MyReceiver extends BroadcastReceiver{

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			String text = getResultData();
			System.out.println("MyReceiver收到" + text);
		}
    	
    }
}

app2:广播接收者

清单文件

        <receiver android:name="com.ldw.local.top1">
            <intent-filter android:priority="1000">
                <action android:name="com.ldw.sendcast"/>
            </intent-filter>
        </receiver>
                <receiver android:name="com.ldw.local.top2">
            <intent-filter android:priority="800">
                <action android:name="com.ldw.sendcast"/>
            </intent-filter>
        </receiver>
                <receiver android:name="com.ldw.local.top3">
            <intent-filter android:priority="600">
                <action android:name="com.ldw.sendcast"/>
            </intent-filter>
        </receiver>

top1.java

package com.ldw.local;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class top1 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("top1接受到广播");
		String text = getResultData();
		System.out.println("top1" + text);
		//有序广播修改参数值
		setResultData("每个人收到80元");
	}

}

top2.java

package com.ldw.local;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class top2 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("top2接受到广播");
		String text = getResultData();
		System.out.println("top2" + text);
		//有序广播可以拦截广播,,后面的接受不到
		abortBroadcast();
	}

}

top3.java

package com.ldw.local;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class top3 extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("top3接受到广播");
		String text = getResultData();
		System.out.println("top3" + text);
	}

}

 

 

 

 

onDestroy: MainActivity 2025-09-02 19:46:49.064 11143-11143 WindowOnBackDispatcher com.raoshenglin.music050816 W sendCancelIfRunning: isInProgress=false callback=android.view.ViewRootImpl$$ExternalSyntheticLambda12@1cf3322 2025-09-02 19:46:49.065 11143-11143 DecorViewImmersiveImpl com.raoshenglin.music050816 D onDetachedFromWindow 2025-09-02 19:46:49.250 11143-11143 MediaPlayer com.raoshenglin.music050816 V resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false 2025-09-02 19:46:49.250 11143-11143 MediaPlayer com.raoshenglin.music050816 V cleanDrmObj: mDrmObj=null mDrmSessionId=null 2025-09-02 19:46:49.256 11143-11143 FileUtils com.raoshenglin.music050816 E err write to mi_exception_log 2025-09-02 19:46:49.444 11143-25502 lin.music050816 com.raoshenglin.music050816 I This is non sticky GC, maxfree is 33554432 minfree is 8388608 2025-09-02 19:46:50.229 11143-25502 lin.music050816 com.raoshenglin.music050816 I This is sticky GC, maxfree is 33554432 minfree is 8388608 2025-09-02 19:46:50.822 11143-25502 lin.music050816 com.raoshenglin.music050816 I This is non sticky GC, maxfree is 33554432 minfree is 8388608 2025-09-02 19:46:51.385 11143-25502 lin.music050816 com.raoshenglin.music050816 I This is sticky GC, maxfree is 33554432 minfree is 8388608 2025-09-02 19:46:51.858 11143-25502 lin.music050816 com.raoshenglin.music050816 I This is non sticky GC, maxfree is 33554432 minfree is 8388608 2025-09-02 19:46:52.291 1855-1855 qspmHal vendor.qti.qspmhal-service E setAppInfoH atPid = 11143, gpuFname:com.raoshenglin.music050816, gpuFver:10
09-03
物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值