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

AndroidBroadcastReceiver传输机制详解

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

AndroidBroadcastReceiver传输机制详解

Broadcast

应用程序之间传输信息的机制

BroadcastReceiver

接收来自系统和应用中的广播

作用:在特定时间发送特定的标识,让程序进行操作

使用方法

注:

  • BroadcastReceiver生命周期只有十秒左右
  • BroadcastReceiver里不能做一些比较耗时的操作
  • 应该通过Intent给Service,有Service完成
  • 不能使用子线程

广播的种类

普通广播(Normal broadcasts)

所有监听该广播的广播接收者都可以监听到该广播

特点:

  • 同级别接收先后是随机的
  • 级别低的后收到广播
  • 接收器不能截断广播的继续传播也不能处理广播
  • 同级别动态注册高于静态注册
package com.example.broadcastsdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void doclick(View view) {
        switch (view.getId()){
            case R.id.send1: //发送一条普通广播
                Intent intent = new Intent();
                intent.putExtra("msg","这是一条普通广播");
                intent.setAction("BC_MSG");
                intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
                sendBroadcast(intent);
                Log.e("TAG", "doclick: 点击发送广播");
            break;
        }
    }
}

xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|top"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:onClick="doclick"
        android:id="@+id/send1"
        android:text="发送一条普通广播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

BC1

package com.example.broadcastsdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC1接收到的广播信息 "+msg);
    }
}

高版本需要用intent.setComponent指定接收者包路径和类路径

如果需要发给多个类广播,就使用intent.setPackage(“com.example.broadcastsdemo”);

同一包下的BroadcastReceiver都可以接收到广播

设置优先级

<receiver android:name=".BC1"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="100">
        <action android:name="BC_MSG"/>
    </intent-filter>
</receiver>
<receiver android:name=".BC2"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="400">
        <action android:name="BC_MSG"/>
    </intent-filter>
</receiver>

只需要在intent-filter中设置android:priority就可以了

值-1000到1000越大优先级越高

截断广播

public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC2接收到的广播信息 "+msg);
        abortBroadcast();
    }
}

使用 abortBroadcast();关键字

发现普通广播无法中断广播的发送

静态注册是在xml中注册

动态注册

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter intentFilter = new IntentFilter("BC_MSG");
    BC2 bc2 = new BC2();
    registerReceiver(bc2,intentFilter);
}

动态注册大于静态注册,但是他的作用域太低,容易死掉

测试BC1发广播BC2收

public class BC1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC1接收到的广播信息 "+msg);
        Bundle bundle = new Bundle();
        bundle.putString("test","广播处理的数据BC1");
        setResultExtras(bundle);
    }
}
public class BC2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.e("TAG", "BC2接收到的广播信息 "+msg);
       // abortBroadcast();
        Bundle bundle = getResultExtras(true);
        String test = bundle.getString("test");
        Log.e("TAG", "BC2得到的数据"+test );
    }
}

发现普通广播无法传送数据

有序广播(ordered broadcasts)

按照接收者的优先级顺序接收广播,优先级在intent-filter中的priority中声明。-1000到1000之间,值越大,优先级越高。可以终止广播意图的继续传播,接收者可以篡改内容

特点:

  • 同级别接收顺序是随机的
  • 能截断广播的继续传播,高级别的广播接收器收到该广播后,可以决定把该广播是否截断
  • 接收器能截断广播的继续传播,也能处理广播
  • 同级别动态注册高于静态注册

添加按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center|top"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <Button
        android:onClick="doclick"
        android:id="@+id/send1"
        android:text="发送一条普通广播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button
        android:onClick="doclick"
        android:id="@+id/send2"
        android:text="发送一条有序广播"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

添加事件处理

case R.id.send2: //发送一条普通广播
    Intent intent2 = new Intent();
    intent2.putExtra("msg","这是一条有序广播");
    intent2.setAction("BC_MSG");
    //intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
    intent2.setPackage("com.example.broadcastsdemo");
    sendOrderedBroadcast(intent2,null);
    Log.e("TAG", "doclick: 点击发送有序广播");
    break;

发现有序广播可以实现BC2发消息给BC1,且可以中断广播

异步广播(粘滞性滞留广播)

不能将处理结果传给下一个接收者,无法终止广播

添加按钮及事件

<Button
    android:onClick="doclick"
    android:id="@+id/send3"
    android:text="发送一条异步广播"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
case R.id.send3: //发送一条异步广播
    Intent intent3 = new Intent();
    intent3.putExtra("msg","这是一条有序广播");
    intent3.setAction("BC_MSG");
    //intent3.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC3"));
    intent3.setPackage("com.example.broadcastsdemo");
    sendStickyBroadcast(intent3);
    IntentFilter intentFilter = new IntentFilter("BC_MSG");
    BC3 bc3 = new BC3();
    registerReceiver(bc3,intentFilter);
    break;

可以发送和接收分开,先发送再接收

发送完广播要卸载

到此这篇关于Android BroadcastReceiver传输机制详解的文章就介绍到这了,更多相关Android BroadcastReceiver 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

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

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

AndroidBroadcastReceiver传输机制详解

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

下载Word文档

猜你喜欢

AndroidBroadcastReceiver传输机制详解

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

ASP.NET传输机制是什么

这篇文章主要介绍“ASP.NET传输机制是什么”,在日常操作中,相信很多人在ASP.NET传输机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET传输机制是什么”的疑惑有所帮助!接下来,请跟
2023-06-18

Android BroadcastReceiver传输机制是什么

Android BroadcastReceiver传输机制是一种Android系统中的一种组件间通信机制,用于在不同组件之间传递消息和数据。当一个广播事件发生时,系统会将这个广播事件发送到所有注册了相应广播过滤器的BroadcastRece
Android BroadcastReceiver传输机制是什么
2024-03-02

Spring @Transactional事务传播机制详解

我们日常工作中极少使用事务传播级别,单纯只是使用事务和rollbackfor抛出异常来解决事务问题,但其实我们很多时候使用的是不正确的,或者说会造成事务粒度过大,本文详解一下事务传播级别,也让自己更好地处理事务问题。 1. Sprin
2023-08-19

SAP请求号传输机制原理

本篇内容主要讲解“SAP请求号传输机制原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SAP请求号传输机制原理”吧!1.1请求号传输分为二种情况1)、同一个服务器的不同Client进行传输,使
2023-06-05

如何理解PHP中的无状态传输机制

PHP中的无状态传输机制在Web开发中,无状态传输机制是指服务器不会保存客户端的状态信息,每次请求都是独立的,服务器不会保持任何关于客户端状态的信息。PHP作为一种服务器端脚本语言,在处理HTTP请求时采用无状态传输机制,这对于维护服务器
如何理解PHP中的无状态传输机制
2024-03-06

JMS 之 Active MQ 的消息传输(详解)

本文使用Active MQ5.6一、消息协商器(Message Broker)broke:消息的交换器,就是对消息进行管理的容器。ActiveMQ 可以创建多个 Broker,客户端与ActiveMQ交互,实际上都是与ActiveMQ中的B
2023-05-31

MySQL锁机制详解

SQL(锁机制) 锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否是
MySQL锁机制详解
2015-10-14

SpringMVCJSON数据传输参数超详细讲解

有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器
2023-02-07

Java CAS机制详解

这篇文章主要介绍了Java CAS机制,CAS机制是一种数据更新的方式。在具体讲什么是CAS机制之前,我们先来聊下在多线程环境下,对共享变量进行数据更新的两种模式:悲观锁模式和乐观锁模式
2023-01-28

linux传输文件命令 rz 和 sz详解

一. 概述 rz,sz是linux/Unix同Windows进行ZModem文件传输的命令行工具。优点就是不用再开一个sftp工具登录上去上传下载文件。Zmodem协议是针对modem的一种错误校验协议。利用Zmodem协议,
2022-06-04

数据传输 | DTLE Release Notes 详细解读 2.19.11.0

​2.19.11.0 版本 DTLE Release Notes以下对 DTLE 2.19.11.0 版本的 Release Notes 进行详细解读。文章主要分为四部分内容:一、DTLE 项目介绍二、版本特征三、Bug 修复四、DTLE Release N
数据传输 | DTLE Release Notes 详细解读 2.19.11.0
2014-11-11

编程热搜

  • 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第一次实验

目录