Android BroadcastReceiver传输机制详解

目录
  • Broadcast
  • 广播的种类
    • 普通广播(Normal broadcasts)
    • 有序广播(ordered broadcasts)
    • 异步广播(粘滞性滞留广播)

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

(0)

相关推荐

  • Android中BroadcastReceiver案例讲解

    前言 我们在注册一款App的时候,如果注册成功的话,那么我们就直接跳过登陆界面,直接进入主界面,那么我们现在就通过BroadcastReceiver来实现这个功能: (1)注册界面RegisterActivity.java,这里跳过了一些基本的操作,直接调用的是注册方法signUp()方法: btn_reg.signUp(RegisterActivity.this, new SaveListener() { @Override public void onSuccess() { progress

  • Android四大组件之广播BroadcastReceiver详解

    定义 BroadcastReceiver,"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度等等.Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现

  • Android BroadcastReceiver广播简单使用

    本文实例为大家分享了Android BroadcastReceiver广播使用的具体代码,供大家参考,具体内容如下 静态的BroadcastReceiver 主要代码 public class MyReceiver extends BroadcastReceiver { @Override //接受广播时回调 public void onReceive(Context context, Intent intent) { //接收广播 if(intent != null){ //接收到是什么广播

  • Android Broadcast 和 BroadcastReceiver的权限限制方式

    在Android应用开发中,有时会遇到以下两种情况, 1. 一些敏感的广播并不想让第三方的应用收到 : 2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰. 在这些场景下就需要用到广播的权限限制. 第一种场景: 谁有权收我的广播? 在这种情况下,可以在自己应用发广播时添加参数声明Receiver所需的权限. 首先,在Androidmanifest.xml中定义新的权限RECV_XXX,例如: <permission android:name = "

  • Android四大组件之BroadcastReceiver详解

    BroadcastReceiver(广播接收器),在Android开发中,BroadcastReceiver的应用场景非常多,属于Android四大组件之一. Android 广播分为两个角色:广播发送者.广播接收者 一. 作用 用于监听 / 接收 应用发出的广播消息,并做出响应 应用场景: 不同组件之间通信(包括应用内 / 不同应用之间) 与 Android 系统在特定情况下的通信(如当电话呼入时.网络可用时) 多线程通信 二.实现原理 Android中的广播使用了设计模式中的观察者模式:基于

  • Android 广播接收器BroadcastReceiver详解

    目录 一.什么是BroadcastReceiver 1.1.作用 1.2.实现原理 二.创建广播接收器 三.注册广播接收器 3.1.静态注册 注册 发送通知 3.2.动态注册 四.系统广播 总结 一.什么是BroadcastReceiver BroadcastReceiver 是安卓系统中四大组件之一,在Android开发中,BroadcastReceiver的应用场景非常多,Android 广播分为两个角色:广播发送者.广播接收者. 1.1.作用 广播接收器用于响应来自其他应用程序或者系统的广

  • Android使用BroadcastReceiver监听网络连接状态的改变

    只需要实现下面2段代码即可实现对网络连接状态的监听,千万别忘了在Manifest.xml里面添加网络访问权限哦. 1.定义广播接收器 NetState.java package huaxa.it.map.net; import huaxa.it.map.demo.MapDemo; import com.baidu.mapapi.map.MapView; import android.content.BroadcastReceiver; import android.content.Context

  • Android BroadcastReceiver传输机制详解

    目录 Broadcast 广播的种类 普通广播(Normal broadcasts) 有序广播(ordered broadcasts) 异步广播(粘滞性滞留广播) Broadcast 应用程序之间传输信息的机制 BroadcastReceiver 接收来自系统和应用中的广播 作用:在特定时间发送特定的标识,让程序进行操作 使用方法 注: BroadcastReceiver生命周期只有十秒左右 BroadcastReceiver里不能做一些比较耗时的操作 应该通过Intent给Service,有S

  • Android NTP 时间同步机制详解

    目录 正文 初始化 NetworkTimeUpdateCallback AutoTimeSettingObserver MyHandler onPollNetworkTime 总结 正文 NTP是Android原生通过网络获取时间的机制,其中关键代码逻辑都在NetworkTimeUpdateService,它是Android系统服务,由SystemServer启动. 本篇文章基于Android 10源码分析. 初始化 我们从它的构造方法开始分析: public NetworkTimeUpdate

  • Android中Intent机制详解及示例总结(总结篇)

    最近在进行android开发过程中,在将 Intent传递给调用的组件并完成组件的调用时遇到点困难,并且之前对Intent的学习也是一知半解,最近特意为此拿出一些时间,对Intent部分进行了系统的学习并进行了部分实践,下面将自己的学习及Intent知识进行了详细的归纳整理,希望能帮助到同样遇到相同问题的博友. 下面是Intent介绍.详解及Intent示例总结: 一.Intent介绍: Intent的中文意思是"意图,意向",在Android中提供了Intent机制来协助应用间的交互

  • Android异步消息机制详解

    Android中的异步消息机制分为四个部分:Message.Handler.MessageQueue和Looper. 其中,Message是线程之间传递的消息,其what.arg1.arg2字段可以携带整型数据,obj字段可以携带一个Object对象. Handler是处理者,主要用于发送消息和处理消息.发送消息的方法是sendMessage:处理消息的方法是handleMessage(),Message字段携带的信息在该方法中用作判别. MessageQueue是消息队列,存放所有Handle

  • Android中的binder机制详解

    前言 Binder做为Android中核心机制,对于理解Android系统是必不可少的,关于binder的文章也有很多,但是每次看总感觉看的不是很懂,到底什么才是binder机制?为什么要使用binder机制?binder机制又是怎样运行的呢?这些问题只是了解binder机制是不够的,需要从Android的整体系统出发来分析,在我找了很多资料后,真正的弄懂了binder机制,相信看完这篇文章大家也可以弄懂binder机制. 1.Binder是什么? 要理解binder,先要知道IPC,Inter

  • Android Handler机制详解原理

    Looper是整个跨线程通信的管理者 // 内部持有的变量如下: ThreadLocal<Looper> MainLooper Observer MessageQueue Thread 1.首先先回忆一下Handler怎么用 Android线程通信分为以下两种情况 1.子线程发消息给UI线程 2.UI线程发消息给子线程 3.子线程发消息给另个子线程 1.子线程发消息给UI线程 class FragmentContentActivity : AppCompatActivity() { val F

  • Android开发App启动流程与消息机制详解

    目录 引言 1.第一步了解 ThreadLocal 2.App的启动流程 3.Activity中创建Handler 引言 相信很多人对这个问题不陌生,但是大家回答的都比较简单,如谈到app启动流程有人就会是app的生命周期去了,谈到消息机制有人就会说looper循环消息进行分发,如果是面试可能面试官不会满意,今天我们搞一篇完善的源码解析来进行阐述上面的问题 1.第一步了解 ThreadLocal 什么是ThreadLocal呢,专业的来讲,ThreadLocal 是一个线程内部的数据存储类,通过

  • Android studio 混淆配置详解

    混淆 studio 使用Proguard进行混淆,其是一个压缩.优化和混淆java字节码文件的一个工具. 功能:Shrinking(压缩).Optimization(优化).Obfuscattion(混淆).Preverification(预校验)四个操作. 优点: 1.删除项目无用的资源,有效减小apk大小: 2.删除无用的类.类成员.方法和属性,还可以删除无用的注释,最大限度的优化字节码文件: 3.使用简短无意义的名称重命名已存在的类.方法.属性等,增加逆向工程的难度. 配置 buildTy

  • Android 消息队列模型详解及实例

    Android 消息队列模型详解及实例 Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列(Message Queue)和一个消息循环(Looper).Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的.如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环.如以下代码所示: class

  • JavaMail邮件发送机制详解

    这篇文章主要介绍了JavaMail邮件发送机制详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序. 应用场景 一般在系统的注册模块,当用户填入注册信息的邮箱时,点击保存.系统根据用户的信息会自动给用户发送一封

随机推荐