iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >AndroidBroadcastReceiver传输机制详解
  • 265
分享到

AndroidBroadcastReceiver传输机制详解

AndroidBroadcastReceiver传输机制AndroidBroadcastReceiver 2023-01-31 09:01:34 265人浏览 独家记忆
摘要

目录Broadcast广播的种类普通广播(NORMal broadcasts)有序广播(ordered broadcasts)异步广播(粘滞性滞留广播)Broadcast 应用程序之

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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: AndroidBroadcastReceiver传输机制详解

本文链接: https://www.lsjlt.com/news/188922.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • AndroidBroadcastReceiver传输机制详解
    目录Broadcast广播的种类普通广播(Normal broadcasts)有序广播(ordered broadcasts)异步广播(粘滞性滞留广播)Broadcast 应用程序之...
    99+
    2023-01-31
    Android BroadcastReceiver传输机制 Android BroadcastReceiver
  • ASP.NET传输机制是什么
    这篇文章主要介绍“ASP.NET传输机制是什么”,在日常操作中,相信很多人在ASP.NET传输机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”ASP.NET传输机制是什么”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-18
  • Android BroadcastReceiver传输机制是什么
    Android BroadcastReceiver传输机制是一种Android系统中的一种组件间通信机制,用于在不同组件之间传递消息...
    99+
    2024-03-02
    Android
  • Spring @Transactional事务传播机制详解
    我们日常工作中极少使用事务传播级别,单纯只是使用事务和rollbackfor抛出异常来解决事务问题,但其实我们很多时候使用的是不正确的,或者说会造成事务粒度过大,本文详解一下事务传播级别,也让自己更好地处理事务问题。 1. Sprin...
    99+
    2023-08-19
    spring java 后端
  • 如何理解PHP中的无状态传输机制
    PHP中的无状态传输机制 在Web开发中,无状态传输机制是指服务器不会保存客户端的状态信息,每次请求都是独立的,服务器不会保持任何关于客户端状态的信息。PHP作为一种服务器端脚本语言,...
    99+
    2024-03-06
    php无状态传输 php状态管理 php通信机制 表单提交
  • SAP请求号传输机制原理
    本篇内容主要讲解“SAP请求号传输机制原理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SAP请求号传输机制原理”吧!1请求号传输分为二种情况1)、同一个服务器的不同Client进行传输,使用事...
    99+
    2023-06-05
  • C++字符串输入缓冲区机制详解
    目录一、缓冲定义1.缓冲定义 2.为什么引入缓冲区 二、scanf,cin输入缓冲区1.scanf和cin的缓冲类型 2.scanf和cin的缓冲机制 3.cin.getline和c...
    99+
    2024-04-02
  • scp 文件传输命令详解
    1. scp简介 scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数]本地文件 远程账户@远程 IP 地址:远程目录”。scp 不仅能够通过...
    99+
    2023-09-08
    linux 网络 服务器
  • 详情解析TCP与UDP传输协议
    目录一、什么是 socket ?二、Socket 编程的重要概念① IP 地址② TCP/IP 端口③ 协议三、socket 编程的 API 接口① Linux 下的 socket ...
    99+
    2024-04-02
  • JMS 之 Active MQ 的消息传输(详解)
    本文使用Active MQ5.6一、消息协商器(Message Broker)broke:消息的交换器,就是对消息进行管理的容器。ActiveMQ 可以创建多个 Broker,客户端与ActiveMQ交互,实际上都是与ActiveMQ中的B...
    99+
    2023-05-31
    jms active mq
  • Spring超详细讲解事务和事务传播机制
    目录为什么需要事务Spring 声明事务Transactional参数说明propagationisolationtimeout事务回滚失效解决方案@Transactional工作原...
    99+
    2024-04-02
  • Java CAS机制详解
    目录一、什么是CAS什么是CAS机制为何CAS如此优秀CAS为什么要和volitile配合使用二、Java中的Atomic原子操作包三、类AtomicInteger四、Unsafe类...
    99+
    2023-01-28
    Java CAS Java CAS机制
  • HTML5中页面消息传输机制的示例分析
    这篇文章主要介绍HTML5中页面消息传输机制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!HTML5 的Message API能够让HTML5页面之间传递消息,甚至这些页面...
    99+
    2024-04-02
  • ARP协议详细解析(同网段传输,不同网段传输,免费ARP)
    地址解析协议 (ARP) ARP(Address Resolution Protocol,地址解析协议)是根据IP地址获取数据链路层地址(MAC地址)的一个TCP/IP协议。ARP是IPv4中必不可少的一种协议,它的主要功能是: 将IP...
    99+
    2023-09-24
    网络 服务器 网络协议
  • 深入研究 PHP Session 跨域的数据传输机制
    Session是一种在Web开发中用于保存用户状态的机制,它提供了一种持久化保存用户数据的方式,使得用户可以在不同页面间保持登录状态。然而,当涉及跨域的数据传输时,Session机制可能面临一些挑战。在PHP中,Session是通过HTTP...
    99+
    2023-10-21
    数据传输 PHP Session 跨域
  • SpringBoot+RabbitMQ实现消息可靠传输详解
    目录环境配置消息丢失分析生产阶段生产端模拟消息丢失RabbitMQ消费端环境配置 SpringBoot 整合 RabbitMQ 实现消息的发送。 1.添...
    99+
    2024-04-02
  • SpringMVCJSON数据传输参数超详细讲解
    目录一、JSON普通数组二、JSON对象数据三、JSON对象数组前面我们说过,现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是==JSON==,所以前端...
    99+
    2023-02-07
    SpringMVC JSON数据传输参数 SpringMVC数据传输 SpringMVC JSON数据传输
  • Python接口传输url与flask数据详解
    周五下午,作为小白太痛苦了,这两天一直在做一件事,如下: 使flask接口中的函数执行的同时,向指定的url传递数据(我甚至不知道怎么描述这个问题)。大概的函数结构使这样的: app...
    99+
    2024-04-02
  • Android View 绘制机制的详解
    View 绘制机制一、 View 树的绘图流程当 Activity 接收到焦点的时候,它会被请求绘制布局,该请求由 Android framework 处理.绘制是从根节点开始,对布局树进行 measure 和 draw。整个 View 树...
    99+
    2023-05-31
    android view 绘制
  • JS面试之异步模拟超时重传机制详解
    目录引言题目分析代码设计核心讲解引言 前面我讲解了两篇有关异步的逻辑思维题目,一个是红绿灯转换,还有一个是异步并发限制。有小伙伴私信我说不过瘾,希望还能再出一篇异步超时重传的讲解。为...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作