Android 广播接收器BroadcastReceiver详解

目录
  • 一、什么是BroadcastReceiver
    • 1.1、作用
    • 1.2、实现原理
  • 二、创建广播接收器
  • 三、注册广播接收器
    • 3.1、静态注册
      • 注册
      • 发送通知
    • 3.2、动态注册
  • 四、系统广播
  • 总结

一、什么是BroadcastReceiver

BroadcastReceiver 是安卓系统中四大组件之一,在Android开发中,BroadcastReceiver的应用场景非常多,Android 广播分为两个角色:广播发送者、广播接收者。

1.1、作用

广播接收器用于响应来自其他应用程序或者系统的广播消息。

  • 不同组件之间通信(包括应用内 / 不同应用之间)
  • 与 Android 系统在特定情况下的通信(如当电话呼入时、网络可用时)
  • 多线程通信

1.2、实现原理

Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

模型中有3个角色:

  • 消息订阅者(广播接收者)
  • 消息发布者(广播发布者)
  • 消息中心(AMS,即Activity Manager Service)

广播接收者通过 Binder机制在AMS注册

广播发送者通过 Binder 机制向AMS发送广播

AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)

AMS将广播发送到合适的广播接收者相应的消息循环队列中;

广播接收者通过消息循环拿到此广播,并回调 onReceive()

二、创建广播接收器

广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("我是创建好的通知");
    }
}

三、注册广播接收器

广播接收器的注册分为两种:

  • 静态注册
  • 动态注册

3.1、静态注册

应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。

注册

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".MyReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.tiger_test"
            tools:ignore="BatteryLife" />
    </intent-filter>
</receiver>

发送通知

在Activity 中新增一个发送通知的点击事件

    public void onClickStatic(View view) {
        System.out.println("MainActivity2.onClickStatic");
//        com.tiger_test 必须和清单文件中注册的保持一致
        Intent intent = new Intent();
        intent.setAction("com.tiger_test");
        intent.setPackage("com.traveleasy.activitydemo");
        sendBroadcast(intent);
    }

当点击通知发送按钮时,系统会自动实例化MyReceiver类,并注册到系统中。

静态注册是常驻广播,不受任何组件生命周期的影响

注意:由于自8.0以后隐式广播不能进行静态注册了,所以这里通过setPackage()指定应用程序响应广播。

3.2、动态注册

通过registerReceiver()注册广播监听

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
//        在onCreate 中注册广播
        MyReceiver myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.tiger_test");
        registerReceiver(myReceiver, filter);
    }

触发通知

public void onClickStatic(View view) {
    //        com.tiger_test 必须和注册的保持一致
    Intent intent = new Intent();
    intent.setAction("com.tiger_test");
    sendBroadcast(intent);
}

在页面关闭时记得通过unregisterReceiver()注销广播监听,否则会因广播持有Activity引用导致内存泄露。

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

运行结果

需要注意,在onReceive()不能执行耗时操作,onReceive()默认是在主线程中,进行耗时会阻塞主线程,如果非要执行耗时操作最好开启一个服务在服务中进行耗时操作,不建议开启线程来处理耗时操作,因为BroadCastReceiver的生命周期很短,可能在子线程结束前BroadCastReceiver已经退出,如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。

四、系统广播

上面我们一起学习了自定义广播,下面我们一起来看一下Android 系统主要的系统广播类型。

事件常量 描述
android.intent.action.BATTERY_CHANGED 持久的广播,包含电池的充电状态,级别和其他信息。
android.intent.action.BATTERY_LOW 标识设备的低电量条件。
android.intent.action.BATTERY_OKAY 标识电池在电量低之后,现在已经好了。
android.intent.action.BOOT_COMPLETED 在系统完成启动后广播一次。
android.intent.action.BUG_REPORT 显示报告bug的活动。
android.intent.action.CALL 执行呼叫数据指定的某人。
android.intent.action.CALL_BUTTON 用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。
android.intent.action.DATE_CHANGED 日期发生改变。
android.intent.action.REBOOT 设备重启。

总结

在BroadcastReceiver 中,广播的类型主要分为两大类

  • 标注广播
  • 有序广播

标准广播

标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。

有序广播

有序广播是一种完全同步的广播,在广播发出后只能有一个BroadcastReceiver能接收到这个广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才能继续向下传递。所以这个广播是有顺序的,所以这种广播也是可以被拦截的,如果被拦截了后面的BroadCastReceiver则不能收到广播消息了。

到此这篇关于Android 广播接收器BroadcastReceiver详解的文章就介绍到这了,更多相关Android BroadcastReceiver内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin语言使用BroadcastReceiver示例介绍

    目录 一.动态注册和静态注册 二.自定义广播 1.方法解析 2.发送标准广播 一.动态注册和静态注册 动态注册:在代码中注册 动态注册能监听到大部分的系统广播和自定义的广播(都为隐式广播) 步骤 1.新建一个Broadcast Receiver的子类,重写onReceiver方法,当接收到广播时,会执行onReceiver方法里面的内容. 2.调用registerRecevier方法注册,将intentFilter和Broadcast Receiver的子类的实例代入,其中intentFilte

  • BroadcastReceiver静态注册案例详解

    BroadcastReceiver静态注册案例演示,供大家参考,具体内容如下 静态注册与动态注册的区别: 动态注册:广播接收器可以自由的控制注册与取消,具有很大的灵活性.但只有在应用程序启动后才能收到广播.并且动态注册的广播接收器的生命周期与其对应的Acitivity的生命周期是一致的.静态注册:又叫做清单注册,即在AndroidManifest.xml中进行注册.静态注册的广播不受程序是否启动的约束,当应用程序关闭后,还可以接收到广播. 效果图: 代码: MainActivity.java p

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

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

  • BroadcastReceiver动态注册案例详解

    BroadcastReceiver动态注册案例演示,供大家参考,具体内容如下 此案例共介绍2种动态注册广播接收器,为自定义广播接收器和系统广播接收器.当点击发送按钮后,将会弹出收到自定义广播的提示:当打开或关闭飞行模式时,会出现飞行模式发生变化的提示. 效果图: 代码: MainActivity.java public class MainActivity extends AppCompatActivity {     private MyBroadcastReceiver receiver1;

  • Android BroadcastReceiver广播简单使用

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

  • Android 广播接收器BroadcastReceiver详解

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

  • Android开发之AppWidget详解

    Android通知系统是它的一大特色,而其中,AppWidget是其中一个亮点.在开发应用的中,很多时候可以为其添加一个AppWidget显示在桌面中,及时方便的与用户进行 交互.这里就简单的熟悉一下开发一个AppWidget的流程吧. 想要在应用中创建一个AppWidget,至少需要以下几样东西: 需要创建一个AppWidgetProviderInfo,来描述AppWidget的元数据. 需要实现一个自己的AppWidgetProvider对AppWidget进行更新等操作. 需要布局文件来描

  • Android NTP 时间同步机制详解

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

  • Android studio 混淆配置详解

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

  • Kotlin实现Android系统悬浮窗详解

    目录 Android 弹窗浅谈 系统悬浮窗具体实现 权限申请 代码设计 具体实现 FloatWindowService 类 FloatWindowManager 类 FloatWindowManager 类代码 FloatLayout 类及其 Layout HomeKeyObserverReceiver 类 FloatWindowUtils 类 总结 Android 弹窗浅谈 我们知道 Android 弹窗中,有一类弹窗会在应用之外也显示,这是因为他被申明成了系统弹窗,除此之外还有2类弹窗分别是

  • Android ActivityManagerService启动流程详解

    目录 概述 AMS的启动流程 启动流程图 概述 AMS是系统的引导服务,应用进程的启动.切换和调度.四大组件的启动和管理都需要AMS的支持.从这里可以看出AMS的功能会十分的繁多,当然它并不是一个类承担这个重责,它有一些关联类. AMS的启动流程 1:SystemServer#main -> 2:SystemServer#run -> 3:SystemServiceManager#startBootstrapServices 1:首先SystemServer进程运行main函数, main函数

  • Android分包MultiDex策略详解

    1.分包背景 这里首先介绍下MultiDex的产生背景. 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生成一个ODEX文件,即Optimised Dex.执行ODex的效率会比直接执行Dex文件的效率要高很多. 但是在早期的Android系统中,DexOpt有一个问题,DexOpt会把每一个类的方法id检索起来,存在一个链表结构里面.但是这个链表的长度是用一

  • Android系统对话框使用详解(最详细)

    在实际应用开发中,用到系统对话框中的情况几乎是没有的.按开发流程来说,UI工程师都会给出每一个弹窗的样式,故而在实际开发中都是自定义弹窗的. 即使用到的地方不多,但是我们也是需要了解并且能熟练的运用它,下面为大家奉上各种系统对话框的实现. 目录 一.系统对话框的几种类型与实现 在项目的实际开发中,用到的系统对话框几乎是没有的.原因大概包含以下几点: 样式过于单一,不能满足大部分实际项目中的需求. 对话框的样式会根据手机系统版本的不同而变化.不能达到统一的样式. 能实现的功能过于简单. 在这里先附

  • Android HandlerThread使用方法详解

    Android HandlerThread使用方法详解 HandlerThread 继承自Thread,内部封装了Looper. 首先Handler和HandlerThread的主要区别是:Handler与Activity在同一个线程中,HandlerThread与Activity不在同一个线程,而是别外新的线程中(Handler中不能做耗时的操作). 用法: import android.app.Activity; import android.os.Bundle; import androi

随机推荐