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

Android开发应用中Broadcast Receiver组件详解

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Android开发应用中Broadcast Receiver组件详解

BroadcastReceiver(广播接收器)是Android中的四大组件之一。下面就具体介绍一下Broadcast Receiver组件的用法。

下面是Android Doc中关于BroadcastReceiver的概述:

①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

②应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。

③广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

 Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。另外一种是我们自定义的广播事件。

广播事件的流程

①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。

②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action。

③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。onReceive中代码的执行时间不要超过5s,否则Android会弹出超时dialog。

下面我通过代码演示自定义广播事件和系统广播事件的使用。

Step1:在MainActivity的onStart方法中注册广播事件。静态注册方式是在AndroidManifest.xml文件中。

Step2: 点击相应按钮后会触发相应的方式来发送广播消息。


 
public class MainActivity extends Activity { 
  private Button sendStaticBtn; 
  private Button sendDynamicBtn; 
  private Button sendSystemBtn; 
  private static final String STATICACTION = "com.byread.static"; 
  private static final String DYNAMICACTION = "com.byread.dynamic"; 
  // USB设备连接 
  private static final String SYSTEMACTION = Intent.ACTION_POWER_CONNECTED; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    sendStaticBtn = (Button) findViewById(R.id.send_static); 
    sendDynamicBtn = (Button) findViewById(R.id.send_dynamic); 
    sendSystemBtn = (Button) findViewById(R.id.send_system); 
    sendStaticBtn.setOnClickListener(new MyOnClickListener()); 
    sendDynamicBtn.setOnClickListener(new MyOnClickListener()); 
    sendSystemBtn.setOnClickListener(new MyOnClickListener()); 
  } 
  class MyOnClickListener implements OnClickListener{ 
    @Override 
    public void onClick(View v) { 
      // 发送自定义静态注册广播消息 
      if(v.getId() == R.id.send_static){ 
        Log.e("MainActivity", "发送自定义静态注册广播消息"); 
        Intent intent = new Intent(); 
        intent.setAction(STATICACTION); 
        intent.putExtra("msg", "接收静态注册广播成功!"); 
        sendBroadcast(intent); 
      } 
      // 发送自定义动态注册广播消息 
      else if(v.getId() == R.id.send_dynamic){ 
        Log.e("MainActivity", "发送自定义动态注册广播消息"); 
        Intent intent = new Intent(); 
        intent.setAction(DYNAMICACTION); 
        intent.putExtra("msg", "接收动态注册广播成功!"); 
        sendBroadcast(intent); 
      } 
      // 发送系统动态注册广播消息。当手机连接充电设备时会由系统自己发送广播消息。 
      else if(v.getId() == R.id.send_system){ 
        Log.e("MainActivity", "发送系统动态注册广播消息"); 
        Intent intent = new Intent(); 
        intent.setAction(SYSTEMACTION); 
        intent.putExtra("msg", "正在充电。。。。"); 
      } 
    } 
  } 
  @Override 
  protected void onStart() { 
    super.onStart(); 
    Log.e("MainActivity", "注册广播事件"); 
    // 注册自定义动态广播消息 
    IntentFilter filter_dynamic = new IntentFilter(); 
    filter_dynamic.addAction(DYNAMICACTION); 
    registerReceiver(dynamicReceiver, filter_dynamic); 
    // 注册系统动态广播消息 
    IntentFilter filter_system = new IntentFilter(); 
    filter_system.addAction(SYSTEMACTION); 
    registerReceiver(systemReceiver, filter_system); 
  } 
  private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      Log.e("MainActivity", "接收自定义动态注册广播消息"); 
      if(intent.getAction().equals(DYNAMICACTION)){ 
        String msg = intent.getStringExtra("msg"); 
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 
      } 
    } 
  }; 
  private BroadcastReceiver systemReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
      Log.e("MainActivity", "接收系统动态注册广播消息"); 
      if(intent.getAction().equals(SYSTEMACTION)){ 
        String msg = intent.getStringExtra("msg"); 
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 
      } 
    } 
  }; 
} 

Step3:接收广播消息。以下为两个静态注册的广播接收器。


 
public class StaticReceiver extends BroadcastReceiver { 
  @Override 
  public void onReceive(Context context, Intent intent) { 
    String msg = intent.getStringExtra("msg"); 
    Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); 
  } 
} 

 
public class SystemReceiver extends BroadcastReceiver { 
  @Override 
  public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) { 
      Log.e("SystemReceiver", "电量低提示"); 
      Toast.makeText(context, "您的手机电量偏低,请及时充电", Toast.LENGTH_SHORT).show(); 
    } 
  } 
} 

下面是AndroidManifest.xml文件:


<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  package="com.byread" android:versionCode="1" android:versionName="1.0"> 
  <application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".MainActivity" android:label="@string/app_name"> 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity> 
    <!-- 注册自定义静态广播接收器 --> 
    <receiver android:name=".StaticReceiver"> 
      <intent-filter> 
        <action android:name="com.byread.static" /> 
      </intent-filter> 
    </receiver> 
    <!-- 注册系统静态广播接收器 --> 
    <receiver android:name=".SystemReceiver"> 
      <intent-filter> 
        <action android:name="android.intent.action.BATTERY_LOW" /> 
      </intent-filter> 
    </receiver> 
  </application> 
</manifest> 

界面布局文件main.xml


<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <TextView android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:text="@string/hello" /> 
  <Button android:id="@+id/send_static" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="发送自定义静态注册广播" /> 
  <Button android:id="@+id/send_dynamic" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="发送自定义动态注册广播" /> 
  <Button android:id="@+id/send_system" android:layout_width="wrap_content" 
    android:layout_height="wrap_content" android:text="发送系统动态注册广播" /> 
</LinearLayout> 

讲解结束,不过有一点我自己也没弄清楚,这个系统广播事件如果我在程序中sendBroadcast的话,那就是自定义广播了。如果不写的话,那是不是系统自己来发送对应Action广播呢?有知道的同学请告诉我一下,再此先谢过。 

运行界面:


您可能感兴趣的文章:Android BroadcastReceiver常见监听整理详解Android中BroadCastReceiver组件Android编程四大组件之BroadcastReceiver(广播接收者)用法实例Android开发之BroadcastReceiver用法实例分析Android提高之BroadcastReceiver实例详解Android中BroadcastReceiver(异步接收广播Intent)的使用


免责声明:

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

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

Android开发应用中Broadcast Receiver组件详解

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

下载Word文档

猜你喜欢

Android开发应用中Broadcast Receiver组件详解

BroadcastReceiver(广播接收器)是Android中的四大组件之一。下面就具体介绍一下Broadcast Receiver组件的用法。下面是Android Doc中关于BroadcastReceiver的概述:①广播接收器是一
2022-06-06

Android应用开发中RecyclerView组件使用入门教程

RecyclerView是一种列表容器, 发布很久了, 才想起来写点什么. RecyclerView相比于ListView, 在回收重用时更具有灵活性, 也就是低耦合, 并且提供了扩展. 加载多个视图时, 应该多用RecyclerView代
2022-06-06

详解MVP模式在Android开发中的应用

一、MVP介绍 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MV
2022-06-06

Android开发中Flutter组件怎么用

这篇“Android开发中Flutter组件怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android开发中Flut
2023-06-30

Android开发Jetpack组件ViewModel使用讲解

这篇文章主要介绍了AndroidJetpack架构组件ViewModel详解,ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在,ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据。感兴趣可以来学习一下
2022-11-13

Android开发Jetpack组件Room使用讲解

Room是一个数据库访问组件;对SqLite数据库做了友好的封装,使我们在编码的时候,只需要注重逻辑的部分即可,数据库就交给Room去流畅的访问即可
2022-11-13

Android开发中LayoutInflater用法详解

本文实例讲述了Android开发中LayoutInflater用法。分享给大家供大家参考,具体如下: 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflat
2022-06-06

Android开发笔记之:AsyncTask的应用详解

AsyncTask的介绍及基本使用方法关于AsyncTask的介绍和基本使用方法可以参考官方文档和《Android开发笔记之:深入理解多线程AsyncTask》这里就不重复。AsyncTask引发的一个问题上周遇到了一个极其诡异的问题,一个
2022-06-06

Android开发之WebView组件的使用解析

在 Android 手机中内置了一款高性能 webkit 内核浏览器, SDK 中封装为一个叫做 WebView 组件。 WebView 类是 WebKit 模块 Java 层的视图类,( 所有需要使用 Web 浏览功能的Android应用
2022-06-06

详解Android应用开发中Intent的作用及使用方法

Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,
2022-06-06

详解Java编程中的反射在Android开发中的应用

反射定义 “反射”(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。 为何需要反射 反射带来的好处包括: 在运行时检测对象的类型。 动态构造某个类的对象。 检测类的属性和方法。 任意调用对象的
2022-06-06

Android开发中libs和jinLibs文件夹的作用详解

前言相信各位Android开发中们在Android 开发中经常和这两个文件夹打交道,以前一直迷迷糊糊的使用,没去想过。最近遇到了一些问题,仔细研究了一下,特此记录分享。下面话不多说了,来一起看看详细的介绍吧。libs: librarys用来
2023-05-30

编程热搜

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

目录