BroadcastReceiver 介绍:

广播是一种广泛运用的在应用程序之间传输信息的机制 。而 BroadcastReceiver 是对发送出来的广播 进行过滤接收并响应的一类组件

接受一种或者多种 Intent 作为触发事件,接受相关消息转换成一条 Notification(通告) ,统一了Android的事件广播模型

你的应用可以使用它对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。

广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。

通知可以用很多种方式来吸引用户的注意力 ── 闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

BroadcastReceiver 创建:

1、写一个 java类,继承 BroadcastReceiver

2、重写 public void onReceive(Context context, Intent intent) {} 方法

3、配置清单文件

BroadcastReceiver 激活:

发送广播可以通过传递一个Intent 对象至给Context.sendBroadcast() 、Context.sendOrderedBroadcast()或Context.sendStickyBroadcast()

Android 会调用所有对此广播有兴趣的广播接收器的onReceive()方法,将intent 传递给它们

BroadcastReceiver 触发:

接收到监听的事件后会调用:

public void onReceive(Context context, Intent intent) {       }

BroadcastReceiver 关闭:

广播接收器仅在响应广播信息的时候激活。没有必要去显式的关闭。

BroadcastReceiver 包:

import android.content.BroadcastReceiver;

BroadcastReceiver 配置清单文件配置:

作为四大组件之一,创建之后需要在清单文件中进行注册

< receiver android:name = "包名 + 类名"  >

< intent-filter android:priority = "1000"  >  -- priority:优先级 从-1000 - 1000 逐渐增高

   < action android:name = "android.provider.Telephony.SMS_RECEIVED"  />  -- action: 配置要监听的事件,经常还要配置相应的权限

</ intent-filter >

</ receiver >

通过代码动态注册的方法:

private BroadcastReceiver receiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {

  }
};

IntentFilter intentFilter = new IntentFilter();

intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED ");-- 添加一个要接收的广播,可以add多个广播

registerReceiver(receiver , intentFilter); -- 注册广播接收,一般在onStart或onResume中调用

unregisterReceiver(receiver); -- 取消注册,一般在onDestroy方法中调用

动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了。

静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。

也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用

系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播

BroadcastReceiver 生命周期:

每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive(Context context, Intent intent) 方法 , 执行完以后 , 该对象即被销毁 .

当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 .

所以在 BroadcastReceiver 里不能做一些比较耗时的操作 , 否侧会弹出 ANR(Application No Response) 的对话框

如果需要,应该通过发送 Intent 给 Service, 由Service 来完成 .    这里不能使用子线程来解决 ,

因为 BroadcastReceiver 的生命周期很短 , 子线程可能还没有结束BroadcastReceiver 就先结束了 .

BroadcastReceiver 一旦结束 , 此时 BroadcastReceiver 的所在进程很容易在系统需要内存时被优先杀死 ,

因为它属于空进程 ( 没有任何活动组件的进程 ). 如果它的宿主进程被杀 死 , 那么正在工作的子线程也会被杀死 .    所以采用子线程来解决是不可靠的

广播类型:

1、普通广播:通过Context.sendBroadcast(Intent myIntent)发送的,所有监听该广播的广播接收者都可以监听到改广播。

2、有序广播:通过Context.sendOrderedBroadcast(intent, receiverPermission)发送的

该方法第2个参数决定该广播的级别,级别数值是在 -1000 到 1000 之间 , 值越大 , 发送的优先级越高;

广播接收者接收广播时的级别级别(可通过intentfilter中的priority进行设置设),同级别接收的先后是随机的,

再到级别低的收到广播,高级别的或同级别先接收到广播的可以通过 abortBroadcast()方法截断广播使其他的接收者无法收到该广播

3、异步广播:通过Context.sendStickyBroadcast(Intent myIntent)发送的

还有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler,  initialCode, initialData, initialExtras)方法

该方法具有有序广播的特性也有异步广播的特性;

发送异步广播要: <uses-permission android:name="android.permission.BROADCAST_STICKY" />权限,

接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉

最新文章

  1. log4j日志工具
  2. BP神经网络模型与学习算法
  3. SQL注入实验,PHP连接数据库,Mysql查看binlog,PreparedStatement,mysqli, PDO
  4. UVA 657 The die is cast
  5. AHCI vs NVMe
  6. BZOJ 1303 【CQOI2009】中位数图
  7. jquery获取页面相关尺寸
  8. CentOS IP DNS设置
  9. 【技术说明】iOS10来了,AppCan已全面适配!
  10. ZJOI2019Day2 游记
  11. session 和 cookie (转)
  12. Postgres通用翻页函数
  13. The Art of Unit Testing With Examples in .NET
  14. Scrapy学习篇(六)之Selector选择器
  15. mysql导入数据方法和报错解决
  16. mysql 变量名称的使用不当的一个错误
  17. .net配置404错误页面
  18. 【转】利用JMeter进行压力测试
  19. 七、CommonJS规范和Note.js模块概念的介绍
  20. samba了解

热门文章

  1. Boadload和Image$$??$$Limit含义
  2. 【笔记】jquery阻止冒泡事件发生的语句
  3. call()\apply()\bind()备忘录
  4. CSS 笔记二(Text/Fonts/Links/Lists)
  5. mysql已有数据字符集转换
  6. Codeforces Round #374 (div.2)遗憾题合集
  7. linux服务器默认连接数配置
  8. 。【自学总结 1】------3ds Max 界面
  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:排序、筛选和分页
  10. ASP.NET MVC view引入命名空间