我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android之广播Broadcast

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android之广播Broadcast

一、自定义广播

activity_main.xml


    

广播接受者MyBroadcastReceiver1.java

public class MyBroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "自定义的广播接收者,接收到了求救广播事件");
        Log.i("test", intent.getAction());
    }
}

AndroidManifest.xml注册静态广播

       
1.静态注册

注意intent.setAction(“Help_Stitch”);参数要与AndroidManifest.xml注册的广播名一致,不然接收不到广播。
MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void send(View view) {
        Log.v("test", "send");
        Intent intent = new Intent();
        //静态广播使用Component
        //包路径项目名,包路径接受者
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
        // 定义广播的事件类型
        intent.setAction("Help_Stitch");//参数要与onCreate()里的IntentFilter()的参数一致,不然接收不到广播
        // 发送广播
        sendBroadcast(intent);
    }
}

结果
在这里插入图片描述

2.动态注册

注释掉AndroidManifest.xml的静态广播的注册

<!--        



<!--            -->
<!--                -->
<!--            -->
<!--        -->

修改MainActivity.java
注释掉

intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));

添加全局变量,在onCreate注册广播,添加onDestroy()方法注销广播。
注意intent.setAction(“Help_Stitch”);参数要与onCreate()里的IntentFilter(“Help_Stitch”)的参数一致

	//全局变量,用来注册和注销
	private MyBroadcastReceiver1 mMyBroadcastReceiver1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册广播
        mMyBroadcastReceiver1 = new MyBroadcastReceiver1();
        IntentFilter intentFilter = new IntentFilter("Help_Stitch");
        registerReceiver(mMyBroadcastReceiver1, intentFilter);
    }
    public void send(View view) {
        Log.v("test", "send");
        Intent intent = new Intent();
        // 定义广播的事件类型
        //参数要与onCreate()里的IntentFilter()的参数一致,不然接收不到
        intent.setAction("Help_Stitch");
        // 发送广播
        sendBroadcast(intent);
    }
	//动态广播注销广播接受者
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMyBroadcastReceiver1 != null)
            unregisterReceiver(mMyBroadcastReceiver1);
    }

结果如上

二、有序和无序广播

使用到优先级
新建三个接受者

public class MyBroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "自定义的广播接收者【Receiver1】,接收到了求救广播事件");
        Log.i("test", intent.getAction());
    }
}
public class MyBroadcastReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "自定义的广播接收者【Receiver2】,接收到了求救广播事件");
        Log.i("test", intent.getAction());
    }
}
public class MyBroadcastReceiver3 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("test", "自定义的广播接收者【Receiver3】,接收到了求救广播事件");
        Log.i("test", intent.getAction());
    }
}
1.静态注册

注意AndroidManifest.xml要注册到

        

优先级:android:priority=“500” 优先级越高则越先注册。
如上使用静态注册,如果没有优先级则注册顺序为1、2、3,但是加了优先级后顺序就为2、3、1。
修改MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void send(View view) {
        Log.v("test", "send");
        Intent intent = new Intent();
        // 定义广播的事件类型
        //参数要与onCreate()里的IntentFilter()的参数一致,不然接收不到
        intent.setAction("Broadcast");
        //静态广播使用Component注册每个广播
        //包路径项目名,包路径接受者
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver2"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver3"));
        // 发送广播
        sendOrderedBroadcast(intent,null);
    }

结果
在这里插入图片描述
只有3!
将intent.setComponent()的顺序换一下

        //静态广播使用Component
        //包路径项目名,包路径接受者
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver3"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver2"));

结果为2!
在这里插入图片描述
然后把最后一个2的intent.setComponent()注释掉

        //静态广播使用Component
        //包路径项目名,包路径接受者
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver3"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
//        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver2"));

结果是1。
在这里插入图片描述
结论:最后一个intent.setComponent()覆盖了前面的,所以只广播了最后一个。
要想广播全部则需要将三个intent.setComponent()注释掉,改为intent.setPackage()。

public void send(View view) {
        Log.v("test", "send");
        Intent intent = new Intent();
        // 定义广播的事件类型
        //参数要与onCreate()里的IntentFilter()的参数一致,不然接收不到
        intent.setAction("Broadcast");
        //静态广播使用Component
        //包路径项目名,包路径接受者
//        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver3"));
//        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
//        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver2"));
        intent.setPackage("com.example.ch6");
        // 发送广播
        sendOrderedBroadcast(intent,null);
    }

结果为2、3、1 。

所以多个广播接受者需要用setPackage()。
在这里插入图片描述
如果把AndroidManifest.xml优先级都改成一样的,则顺序为注册顺序1、2、3 。
结果
在这里插入图片描述
还是把优先级设置回来,在send()里同时设置setComponent()和setPackage()

        //静态广播使用Component
        //包路径项目名,包路径接受者
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver1"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver2"));
        intent.setComponent(new ComponentName("com.example.ch6", "com.example.ch6.MyBroadcastReceiver3"));
        intent.setPackage("com.example.ch6");

观察到结果只有3!并不是2、3、1,也不是1、2、3 。
在这里插入图片描述
所以得出结论:setComponent()比setPackage()调用的优先级高。

2.动态注册

修改MainActivity.java
添加MyBroadcastReceiver1、2、3的全局变量,并在onCreate()中注册(注册顺序为1、2、3),先不设置优先级。在onDestroy()设置MyBroadcastReceiver1、2、3的注销。

public class MainActivity extends AppCompatActivity {
    private MyBroadcastReceiver1 mMyBroadcastReceiver1;
    private MyBroadcastReceiver2 mMyBroadcastReceiver2;
    private MyBroadcastReceiver3 mMyBroadcastReceiver3;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter intentFilter = new IntentFilter("Broadcast");
        //注册广播
        mMyBroadcastReceiver1 = new MyBroadcastReceiver1();
        registerReceiver(mMyBroadcastReceiver1, intentFilter);
        mMyBroadcastReceiver2 = new MyBroadcastReceiver2();
        registerReceiver(mMyBroadcastReceiver2, intentFilter);
        mMyBroadcastReceiver3 = new MyBroadcastReceiver3();
        registerReceiver(mMyBroadcastReceiver3, intentFilter);
    }
    public void send(View view) {
        Log.v("test", "send");
        Intent intent = new Intent();
        // 定义广播的事件类型
        //参数要与onCreate()里的IntentFilter()的参数一致,不然接收不到
        intent.setAction("Broadcast");
        sendOrderedBroadcast(intent, null,mMyBroadcastReceiver3,
                null,0,null,null);
    }
    //动态广播注销广播接受者
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mMyBroadcastReceiver1 != null)
            unregisterReceiver(mMyBroadcastReceiver1);
        if (mMyBroadcastReceiver2 != null)
            unregisterReceiver(mMyBroadcastReceiver2);
        if (mMyBroadcastReceiver3 != null)
            unregisterReceiver(mMyBroadcastReceiver3);
    }
}

此时AndroidManifest.xml没有改变,即在AndroidManifest.xml中注册顺序为1、2、3,而优先级为2、3、1 。
结果
在这里插入图片描述
然后把MyBroadcastReceiver的位置换一下,动态注册顺序为3、1、2。
结果为3、1、2。
在这里插入图片描述
结论:动态注册未设置优先级时执行顺序和注册顺序一样,且与AndroidManifest.xml无关。
然后给每个mMyBroadcastReceiver添加优先级:setPriority(100);参数为优先级大小。
这里设置3为100,1为300,2为500;注册顺序依旧为3、1、2 。
结果
在这里插入图片描述
结论:动态注册设置了优先级时,执行顺序和优先级有关,优先级越大越先执行,且与AndroidManifest.xml无关。

3.广播拦截机制

沿用上面例子,执行顺序为2、1、3 。
在MyBroadcastReceiver1设置拦截:abortBroadcast();
结果拦截了3 。
在这里插入图片描述
然后注释掉该拦截,在MyBroadcastReceiver2设置拦截:abortBroadcast();
结果只有2!2之后的所有广播都被拦截了。
在这里插入图片描述
如果只想拦截1,且能接收到3,应该在MyBroadcastReceiver2设置拦截,应该在MainActivity.java修改send()的发送广播的sendOrderedBroadcast()函数的参数。

sendOrderedBroadcast(intent, null);

改为

sendOrderedBroadcast(intent, null,mMyBroadcastReceiver3,null,0,null,null);

即指定接收mMyBroadcastReceiver3 。
结果
在这里插入图片描述

4.一个receiver接收多个携带数据的广播

首先让MyBroadcastReceiver2接收两个广播。
修改MyBroadcastReceiver2.java,注释拦截语句

public class MyBroadcastReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("Broadcast")) {
            Log.i("test", "自定义的广播接收者【Receiver2】处理广播"+intent.getAction());
        } else if (action.equals("Broadcast_2")) {
            Log.i("test", "自定义的广播接收者【Receiver2】处理广播"+intent.getAction());
        } else {
            assert false;
        }
    }
}

再修改MainActivity.java
在**onCreate()**函数中绑定路由,再注册,添加

        IntentFilter intentFilter_2 = new IntentFilter();
        intentFilter_2.addAction("Broadcast_2");
        registerReceiver(mMyBroadcastReceiver2, intentFilter_2);

**send()**函数添加

        Intent intent_2= new Intent();
        intent_2.setAction("Broadcast_2");
		//发送广播
		sendOrderedBroadcast(intent_2,null);

注意:一定要一一对应:addAction()和setAction()参数一样
结果 2接收了两个广播。
在这里插入图片描述
接下来添加传递的数据
1)在发送时,调用Intent的putExtra方法,放入键值对;
2)在receiver中用getStringExtra、getIntExtra等方法来取;

在MainActivity.java的send()函数添加键值对
在这里插入图片描述
在MyBroadcastReceiver2.java添加取值。
在这里插入图片描述
结果
在这里插入图片描述


作者:阿宁呀


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android之广播Broadcast

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android之广播Broadcast

一、自定义广播 activity_main.xml广播接受者MyBroadcastReceiver1.java public class MyBroadcastReceiver1 extends BroadcastReceiver {@Ov
2022-06-06

Android基础知识之broadcast广播详解

Android中的广播用的太多了,今天稍微总结一下。 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一个activity上点击按钮,发送一
2022-06-06

Android四大组件之broadcast广播使用讲解

Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(BroadcastReceive),勇于接收广播;内容提供者(ContentProvider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
2022-12-26

Android中的广播(BroadCast)详细介绍

什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。我们拿广播电台来做个比方。我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播
2022-06-06

详解Android广播Broadcast的启动流程

Android中的广播是一种用于应用程序之间通信的机制。它允许应用程序发送和接收系统级或应用程序级的广播消息。当一个广播被发送时,系统会自动启动广播接收器来处理该广播。下面是Android广播的启动流程:1. 广播发送:应用程序发送一个广播
2023-08-11

Android广播Broadcast的启动流程是什么

这篇“Android广播Broadcast的启动流程是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android广播B
2023-07-05

Kotlin四大组件中的broadcast广播

Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(BroadcastReceive),勇于接收广播;内容提供者(ContentProvider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
2022-12-08

Pytorch中的广播机制详解(Broadcast)

这篇文章主要介绍了Pytorch中的广播机制详解(Broadcast),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-03

Android使用广播(BroadCast)实现强制下线的方法

本文实例讲述了Android使用广播(BroadCast)实现强制下线的方法。分享给大家供大家参考,具体如下: 使用广播简单模拟强制下线功能。 1、新建活动管理类 新建Activity活动管理类,方便管理所有活动。package com.e
2022-06-06

Android组件之BroadcastReceiver广播接收者

这篇文章主要为大家介绍了Android组件之BroadcastReceiver广播接收者实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-16

Android开发之广播机制浅析

对于了解Android程序设计的人都知道,广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化、信号的强弱状态、电话的接听和短信的接收等等,今天本文就来给大家简单介绍一下系统发送、监听这些广
2022-06-06

Android 蓝牙广播

蓝牙广播 广播蓝牙状态变化(开关状态)广播蓝牙设备发现广播蓝牙配对(配对操作)广播ACL 连接状态变化广播蓝牙绑定状态变化(配对状态)广播蓝牙服务启动广播蓝牙服务停止广播蓝牙连接状态广播蓝牙扫描模式广播蓝牙音频状态广播蓝牙数据传输广
2023-08-17

Android四大组件之Broadcast Receiver

Android四大组件之Broadcast Receiver 作者:白璐 日期:2020/2/23 文章目录Android四大组件之Broadcast Receiver概述广播接收器(Broadcast Receiver)Broadcast
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录