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: 点击相应按钮后会触发相应的方式来发送广播消息。

/**
 * MainActivity
 * @author zuolongsnail
 *
 */
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:接收广播消息。以下为两个静态注册的广播接收器。

/**
 * 自定义静态注册广播消息接收器
 * @author zuolongsnail
 *
 */
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();
  }
} 
/**
 * 系统静态注册广播消息接收器
 *
 * @author zuolongsnail
 *
 */
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广播呢?有知道的同学请告诉我一下,再此先谢过。

运行界面:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android提高之BroadcastReceiver实例详解

    前面几篇文章分别讨论了Activity和Service,本文就来讨论BroastcastReceiver,Broastcast是应用程序间通信的手段.BroastcastReceiver也是跟Intent紧密相连的,动态/静态注册了BroastcastReceiver之后,使用sendBroadcast把Intent发送之后,系统会自动把符合条件的BroastcastReceiver启动,这和嵌入式系统的中断类似. 本文所示实例代码主要演示了如何静态/动态注册BroastcastReceiver

  • 详解Android中BroadCastReceiver组件

    BroadcastReceiver也就是"广播接收者"的意思,它是用来接收来自系统和应用中的广播. 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件. 下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程: (1)首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action.Category)装入一

  • Android开发之BroadcastReceiver用法实例分析

    本文实例讲述了Android开发中BroadcastReceiver用法.分享给大家供大家参考.具体分析如下: 在Android系统中,广播(Broadcast)是在组件之间传播数据(Intent)的一种机制. Braodcast Receiver顾名思义就是广播接收器,它和事件处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的.我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息

  • Android BroadcastReceiver常见监听整理

    在Android开发应用过程中 Android BroadcastReceiver经常会用到,所以抽时间整理了一番,省的后续在用到的时候再去百度. BroadcastReceiver几种常见监听 1.BroadcastReceiver监听拨号 <intent-filter android:priority="1000" > <action android:name="android.intent.action.NEW_OUTGOING_CALL"

  • Android编程四大组件之BroadcastReceiver(广播接收者)用法实例

    本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法.分享给大家供大家参考,具体如下: 这里介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,

  • Android中BroadcastReceiver(异步接收广播Intent)的使用

    Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高. 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroadcast()或者Context.sendStickyBr

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

    BroadcastReceiver(广播接收器)是Android中的四大组件之一.下面就具体介绍一下Broadcast Receiver组件的用法. 下面是Android Doc中关于BroadcastReceiver的概述: ①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件.很多广播是源自于系统代码的──比如,通知时区改变.电池电量低.拍摄了一张照片或者用户改变了语言选项.应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态. ②应用程序可以拥有任意数

  • Android开发中amera2 Preview使用详解

    目录 前言 一.Camera2 Preview需要用到哪些模块 二.各个模块的功能和之间的关系 2.1 SurfaceTexture之SurfaceTextureListener 2.1.1 首先看关于SurfaceTexture的说明 2.1.2 SurfaceTextureListener的使用 2.2 CameraManager 2.2.1 CameraManager的作用 2.2.2 使用CameraManager打开Camera 2.3 CameraDevice之StateCallba

  • OpenStack 中的Nova组件详解

    Open Stack Compute Infrastructure (Nova) Nova是OpenStack云中的计算组织控制器.支持OpenStack云中实例(instances)生命周期的所有活动都由Nova处理.这样使得Nova成为一个负责管理计算资源.网络.认证.所需可扩展性的平台.但是,Nova自身并没有提供任何虚拟化能力,相反它使用libvirt API来与被支持的Hypervisors交互.Nova 通过一个与Amazon Web Services(AWS)EC2 API兼容的w

  • Android开发中的单例模式应用详解

    本文实例讲述了Android开发中的单例模式应用.分享给大家供大家参考,具体如下: 单例模式是应用最广的设计模式之一,在应用这种模式的时候,单例对象的类必须保证只有一个实例存在.许多时候,整个系统只需要拥有一个全局对象,这样有利于协调系统的整体行为.如一个应用中,应该只有ImageLoader实例,这个ImageLoader实例中又包含网络请求.缓存系统.线程池等,很耗资源,因此没有理由让他构造多个实例.这种不能自由构造对象的情况就是使用单例模式的场景.在Android系统中存在很多这种场景,比

  • Android编程中HTTP服务用法详解

    本文实例讲述了Android编程中HTTP服务用法.分享给大家供大家参考,具体如下: 在Android中,除了使用java.net包下的API访问HTTP服务之外,我们还可以换一种途径去完成工作.Android SDK附带了Apache的HttpClient API.Apache HttpClient是一个完善的HTTP客户端,它提供了对HTTP协议的全面支持,可以使用HTTP GET和POST进行访问.下面我们就结合实例,介绍一下HttpClient的使用方法. 我们新建一个http项目,项目

  • Android开发之自定义UI组件详解

    Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTouchEvent()方法. /** * Created by nuist__NJUPT on 2021/5/9. * 自定义UI组件 * View组件在布局中是一个矩形的空白区域,没有任何内容 * 而UI组件之所以有内容,是因为继承了View组件之后在其提供的空白区域上重新绘制外观,这就是UI组件的实

  • 微信小程序中的swiper组件详解

    微信小程序中的swiper组件 微信小程序中的swiper组件真的是简单方便 提供了页面中图片文字等滑动的效果 <swiper> <swiper-item></swiper-item> <swiper-item></swiper-item> <swiper-item></swiper-item> </swiper> 这里的就是一个滑块视图容器:而就是你希望滑动的东西,可以是文字也可以是image 其中swipe

  • JavaScript中自定义swiper组件详解

    目录 效果展示 组件设置 步骤1 步骤2 步骤3 使用组件 步骤1 步骤2 步骤3 总结 效果展示 组件设置 步骤1 在pages目录下,新建文件夹components 步骤2 在components下建立新文件夹swiper 在swiper目录下,新建4个文件,分别为 swiper. jsswiper. jsonswiper.wxml swiper.wxss 各文件位置示意图如下: 注:此时编译会报错 错误显示在json那里 先不用管 后面把代码复制粘贴上去再编译就好了 步骤3 分别把下面代码

  • Android7.0中关于ContentProvider组件详解

    作为Android的四大组件之一,ContentProvider作为进程之间静态数据传递的重要手段,其在系统级别的应用中起了重大的作用.毫无疑问,ContentProvider核心机制之一也是Binder,但是和其它3大组件又有区别.因为ContentProvider涉及数据的增删查改,当数据量比较大的时候,继续用Parcel做容器效率会比较低,因此它还使用了匿名共享内存的方式. 但是有一个问题是,ContentProvider的提供者进程不再存活时,其他进程通过Provider读一个非常简单的

  • Emoji表情在Android JNI中的兼容性问题详解

    起因 最近遇到一个问题,把某个字符串计算MD5,之后把该字符串加密与MD5一起上传到服务端,服务端解密后重新计算md5发现与上传的MD5不一致,而出问题的字符串中无一例外都有Emoji表情.但我自己弄个带表情的字符串上传却没有什么问题. 最终确认这是在Android 5.1以下 jstring -> char数组 时出的问题.下面通过一个示例来还原这个过程. 事件还原 假设有一个字符串s,String s = "\uD83D\uDC8B"; ,对应表情

随机推荐