什么是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. meta name="location" 标签的使用

    在进行一些操作的时候,我们可能会用到这个标签来什么,地理位置,不错的网站优化标签. <meta name="location" content="province= ...

  2. ISO/IEC 9899:2011 条款6.10.1——条件包含

    6.10.1 条件包含 约束 1.控制条件包含的表达式应该是一个整数常量表达式,除了:标识符(包括那些词法上与关键字相同的)被解析为以下所描述的:[注:因为控制常量表达式在翻译阶段4期间被计算,所以所 ...

  3. 数据分析入门——pandas之DataFrame数据丢失

    一.数据丢失分类 1)nd中分为两种:None和np.nan(NaN) 其中,None是python中的对象,是一个object:而nan是一个float类型 两种不同的类型,运算速度也是不同的 2) ...

  4. 查看appPackage和appActivity的多种方法

    一.通过adb shell 查看 adb shell dumpsys activity | grep 包名 列如: C:\Users\admin>adb shell root@shamu:/ # ...

  5. [LeetCode] 195. Tenth Line 第十行

    Given a text file file.txt, print just the 10th line of the file. Example: Assume that file.txt has ...

  6. 通过ip远程控制电脑

    现在,很多人都用了不止一台电脑,而同时操作两台电脑是一件比较麻烦的事情,所以,如果能够使用一台电脑的鼠标键盘显示器,去远程控制另一台电脑,那就方便多了. 远程计算机设置 1.先确保本地计算机和远程计算 ...

  7. Java语言和JVM的使用说明书

    Java Language and Virtual Machine Specifications 详细介绍了Java语言各个版本的功能/JVM的工作原理 建议详读/深度 各个版本,在线看或者pdf下载

  8. 关于su下bash:xxx :command not found

    今天在新建组的时候出了问题: $ su Password: # groupadd prj bash: groupadd :command not found 我就纳闷,明明是在su权限下,怎么还不能使 ...

  9. dockfile构建自己的tomcat

    touch  Dockerfile 在Dockerfile中输入以下内容 FROM centosMAINTAINER Irish<3395327965@qq.com>#把宿主机当前上下文的 ...

  10. Linux08 文件系统

    对于磁盘等各类存储设备中所有的数据都以0和1的概念,但对于用户来说,0和1是没有任何意义的,这时候就需要一种类似于“翻译”的机制存在于用户和磁盘之间,Linux中采用的是文件系统+虚拟文件系统(Vir ...