什么是BroadcastReceiver

BroadcastReceiver是Android体系的四大组件之一,本质上是一种全局的监听器,用于监听系统全局的广播消息,正式因为其本质为全局监听,因此可以非常方便的实现系统中不同组件之间的通信。也方便我们自己的app针对系统开机、电量低等广播做出相应反映。同时我们也可以自己发送广播,来实现不同组件之间的通信

系统接收短信广播,然后弹出Toast:

package cn.lixyz.broadcastreceiver;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast; public class MainActivity extends Activity { private IntentFilter filter;
private SMSReceiver sms; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
sms = new SMSReceiver();
registerReceiver(sms, filter); } @Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(sms);
} class SMSReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "有短信", Toast.LENGTH_SHORT).show();
Log.d("TTTT", "~~~~~~~");
}
}
}

MainActivity.java

还需要添加权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />

运行结果:

Android的大量系统事件都会对外发送广播,下面是常见的广播常量:

ACTION_TIME_CHANGED   系统时间被改变

ACTION_DATE_CHANGED   系统日期被改变

ACTION_TIMEZONE_CHANGED   系统时区被改变

ACTION_BOOT_COMPLETED       系统启动完成

ACTION_PACKAGE_ADDED        系统添加包

ACTION_PACKAGE_CHANGED    系统的包改变

ACTION_PACKAGE_REMOVED     系统的包被删除

ACTION_PACKAGE_RESTARTED  系统的包被重启

ACTION_PACKAGE_DATA_CLEARED    系统的包数据被清空

ACTION_BATTERY_CHANGED     电池电量改变

ACTION_BATTERY_LOW     电池电量低

ACTION_POWER_CONNECTED    系统连接电源

ACTION_POWER_DISCONNECTED      系统与电源断开

ACTION_SHUTDOWN        系统被关闭

Broadcast的类型

广播分为标准广播有序广播

              标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎在同一时间都会接收到这条广播,没有顺序可言,这种广播效率高,但无法截断。

有序广播则是一种同步执行的广播,在广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。优先级高的广播接收器可以先接收到,并且可以截断广播,广播被截断后,后面的广播接收器就无法再接收到了。

运行原理

当其他程序发出广播消息之后,所有注册了广播接收器的应用程序都将会检测注册时的过滤器是否与发出的广播消息向匹配,匹配则会调用BroadcastReciver的onReceive()方法进行处理。所以开发BroadcastReciver应用,主要是对onReceive()方法的实现

广播的注册

创建完BroadcastReceiver之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址,否则无法接收广播

静态注册:写在AndroidManifest.xml文件中,注册的广播接收器必须继承BroadReceiver

动态注册:写在代码中使用Context.registerReceiver注册,由Intent来传递注册时用到的Action

广播的收发

刚才说过了,广播分为有序广播和标准广播,那么发送广播的形式也不同

标准广播发送:使用sendBroadcast()发送

有序广播发送:使用sendOrderBroadcast()发送

广播的收取:定义一个继承BroadcastReceiver的类,继承该类后覆盖其onReceiver()方法,并在该方法中响应事件。

有序广播的优先级

有序广播接收器通过intent-filter的priority参数来确定哪个接收器先接收到广播,数值越大,优先级越高,趋势范围在-1000~1000之间,也可以通过abortBroadcast()来阻断广播,阻断之后,之后的接收器则不会再接收到。

本地广播

之前我们看到的都是全局广播,也就是说我们发出的广播,其他应用也可以收到,这就存在安全问题,为了简单的解决安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用内部进行传递,并且广播接收器也只能接收来自应用程序本身发出的广播。

本地广播使用LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册广播接收器的方法。

package cn.lixyz.broadcastreceiver;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private IntentFilter intentFilter; private LocalBroadcastManager localBroadcastManager; private LocalReceiver localReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 获取LocalBroadcastReceiver实例
localBroadcastManager = LocalBroadcastManager.getInstance(this); Button button = (Button) findViewById(R.id.sendlocalBroadcast);
button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Intent intent = new Intent("cn.lixyz.broadcastreceiver.localreceiver");
// 发送本地广播
localBroadcastManager.sendBroadcast(intent);
}
}); intentFilter = new IntentFilter();
intentFilter.addAction("cn.lixyz.broadcastreceiver.localreceiver"); localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter); } @Override
protected void onDestroy() {
super.onDestroy();
// unregisterReceiver(myBroadcastReciver);
} class LocalReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Log.d("TTTT", "接收到了本地广播");
}
}
}

Android笔记(六十)Android总结:四大组件——BroadcastReceiver篇的更多相关文章

  1. Android笔记(六十九) 仿微信界面(一)

          综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ...

  2. Android笔记(六十六) android中的动画——XML文件定义属性动画

    除了直接在java代码中定义动画之外,还可以使用xml文件定义动画,以便重用. 如果想要使用XML来编写动画,首先要在res目录下面新建一个animator文件夹,所有属性动画的XML文件都应该存放在 ...

  3. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  4. Android笔记(六十五) android中的动画——属性动画(propertyanimation)

    补间动画只能定义起始和结束两个帧在“透明度”.“旋转”.“倾斜”.“位移”4个方面的变化,逐帧动画也只能是播放多个图片,无法满足我们日常复杂的动画需求,所以谷歌在3.0开始,推出了属性动画(prope ...

  5. Android笔记(六十四) android中的动画——补间动画(tweened animation)

    补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...

  6. Android笔记(六十二)网络框架volley

    什么是Volley 很多时候,我们的APP都需要用到网络技术,使用HTTP协议来发送接收数据,谷歌推出了一个网络框架——volley,该框架适合进行数据量不大,但通信频繁的网络操作. 它的优点: (1 ...

  7. Android笔记(六十三) android中的动画——逐帧动画( frame-by-frame animation)

    就好像演电影一样,播放实现准备好的图片,来实现动画效果. 逐帧动画需要用到AnimationDrawable类,该类主要用于创建一个逐帧动画,然后我们把这个动画设置为view的背景即可. androi ...

  8. Android Studio(六):Android Studio添加注释模板

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  9. Android笔记(五十九)Android总结:四大组件——Service篇

    什么是服务? 服务(service)是Android中实现程序后台运行的解决方案,适用于去执行那些不需要和用户交互并且还需要长期运行的任务.服务的运行不依赖于任何用户界面. 服务运行在主线程中,所以在 ...

随机推荐

  1. sqlserver表被锁了,解锁方法,删除锁的方法

    -- 查询死锁select        request_session_id spid,       OBJECT_NAME(resource_associated_entity_id) table ...

  2. 【Linux】数据流重定向

    数据流重定向(redirect)就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或设备(打印机之类的).这玩意在Linux的命令行模式下很重要,尤其是想要将某些数据存储下来 ...

  3. [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  4. -bash: /usr/bin/rm: 参数列表过长

    解决方法: find ./ -type f -name "*.nasl"|xargs rm -f find ./ -type f -name "*.*"|xar ...

  5. 【视频开发】【Live555】摄像头采集,264编码,live555直播

    加入 摄像头采集和264编码,再使用live555直播 1.摄像头采集和264编码 将x264改成编码一帧的接口,码流不写入文件而是直接写入内存中(int  Encode_frame 函数中). /* ...

  6. appium 弹窗处理

    测试过程中遇到两类弹窗: 系统权限弹窗具体业务弹窗系统权限弹窗Android系统权限弹窗一般出现在安装 app 后首次打开,如:定位权限.电话权限等.我们可以按顺序执行测试用例,将该类操作放到 Ini ...

  7. 微前端框架 single-spa

    单体应用对比前端微服务化 普通的前端单体应用 微前端架构 1.基本概念 实现一套微前端架构,可以把其分成四部分(参考:https://alili.tech/archive/11052bf4/) 加载器 ...

  8. git简单介绍

    一种常见的版本控制工具 获取 克隆仓库 git支持以ssh或者http的方式来标识远程仓库 git clone git@github.com:username/project.git git clon ...

  9. REST framework之分页组件

    REST framework之分页组件 一 简单分页 查看第n页,每页显示n条 from rest_framework.pagination import PageNumberPagination # ...

  10. SpringCloud——eureka集群

    目的: 第一种普通方式 第二种方式骚操作 Eureka自我保护机制 Eureka集群搭建 说的通俗易懂一点就是,同一个项目部署在多个服务器上. 当注册中心扛不住高并发的时候,这时候 要用集群来扛: 今 ...