观察者模式在Android广播机制上的应用

点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git

一、观察者模式在Android中的应用及体现

Android中可以体现观察者模式的方式,例如消息机制EventBus、广播机制BroadcastReceiver、BanerView和RecycleView的list刷新机制等都涉及到观察者模式。首先介绍一下观察者模式的概念:观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。举个例子,如下代码中,

package com.shijiacheng.observerpattern;

import java.util.Observable;

public class MyPerson extends Observable {

private String name;

private int age;

private String sex;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

setChanged();

notifyObservers();

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

setChanged();

notifyObservers();

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

setChanged();

notifyObservers();

}

@Override

public String toString() {

return "MyPerson [name=" + name + ", age=" + age + ", sex=" + sex + "]";

}

}

注意到:setChanged();notifyObservers();多了这两句调用,通过setChanged();告知数据改变,通过notifyObservers();发送信号通知观察者。降低了类成员变量之间的耦合性,增加执行效率。

二、针对项目中的代码展开详细论述——广播机制中的观察者模式

Android中的广播机制非常灵活,Android可以对应用内自己需要的消息添加广播,也可以对应用外其他感兴趣的内容添加广播,例如应用可以收到手机系统关于手机电量的广播,也可以收到其他应用手机推送的广播,更可以收到应用内其他界面数据变化发来的广播。具体分布如下图所示:

从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:

在AndroidManifest文件中静态注册或在代码中进行动态注册,广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册

广播发送者通过binder机制向AMS发送广播

AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中

消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法

由此看来,广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底是何时才能接收到。显然,整体流程与EventBus非常类似。

三、通过使用观察者模式带来的好处

观察者模式的应用使项目代码模块间的耦合性得到很好的降低,子模块的成员对父模块的依赖得到很好的解决,不需要我们因为一个因素的变化从而再去改变另一个因素,通过观察者模式,实时动态的反应元素变化,充当子模块跟父模块之间的管理桥梁,达到消息传递的作用。当一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式。观察者模式符合接口隔离原则,实现了对象之间的松散耦合

android 广播观察者,作业三——观察者模式在Android广播机制上的应用相关推荐

  1. Android 使用OpenCV的三种方式(Android Studio)

    from: http://blog.csdn.net/sbsujjbcy/article/details/49520791 其实最早接触OpenCV是很久很久之前的事了,大概在2013年的5,6月份, ...

  2. dagger android,Dagger2 系列(三)Dagger2.Android使用详解

    前言 前两篇文章我们介绍了dagger2的使用和基本原理,为了适用于android项目代码特点,更简洁的实现四大组件和Fragment的注入,dagger2团队为我们又进一步的封装,也就是我们要介绍的 ...

  3. android log丢失(三)动态切换logd机制和kernel机制

    之前我们分析了如何修改版本使log机制变成kernel的log机制.这篇博客我们继续修改可以动态切换,这样方便平时log丢失时调试. 我们先来看liblog库的编译mk文件,这个文件中主要修改了对使用 ...

  4. Android学习记录(三十)-- Android 关于手势Gesture的简单实现和实践中遇到的问题。

    1.初识gesture: Android提供的手势:GestureDetector.OnGestureListener. If you only want to listen for a subset ...

  5. android 蓝牙 广播,android蓝牙BLE(三) —— 广播

    ​ 在蓝牙开发中,有些情况是不需要连接的,只要外设广播自己的数据即可,例如苹果的ibeacon.自Android 5.0更新蓝牙API后,手机可以作为外设广播数据. 广播包有两种: 广播包(Adver ...

  6. 观察者模式在android网络监控下的运用

    github:https://github.com/shonegg/NetMonitor 一.对观察者模式的理解: 1.观察者模式,又叫发布-订阅(Publish/Subscribe)模式,定义的是对 ...

  7. 作业三_C#中的观察者模式解析

    作业三_C#中的观察者模式解析 一.观察者模式的理解分析 由于之前没有接触过观察者模式,所以找了一段源码编译运行调试一下.下面是观察者模式用C#模拟实现的示意源码.该段代码模拟了观察者模式的一个运行原 ...

  8. android 面试题(三)

    JAVA相关基础知识 1.面向对象的特征有哪些方面   1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面. 抽象并不打算了解全部问题,而只是选择其中的一 ...

  9. Android活动,控件,碎片,广播,数据库小总结

    系统架构与开发环境搭建 3月2日Android Activities代码练习 3月5日 Intent的应用与传值 3月9日 1:显式Intent与隐式Intent的区别         显式Inten ...

最新文章

  1. php ajax formdata 进度,使用formdata使用ajax将数据发送到PHP
  2. linux文件夹加密访问,技术|Linux系统上用encfs创建和管理加密文件夹
  3. 【杂谈】新手如何掌握深度学习模型?赠书2本,星球券10张
  4. PHP的postman请求的五种数据样式
  5. 连续不等_第九讲 函数的连续性与函数的间断点
  6. c语言中如何让诊断代码右移_如何检测和诊断生产中的慢代码
  7. 将iphone中的照片同步到电脑
  8. 添加删除 板块 struts2
  9. 冯德勇linux百度网盘,RHCE 学习笔记(14)- 文件系统(2) - 搜索文件
  10. java有push方法么_[Java教程]js中push和join方法使用介绍
  11. STL模型文件修改软件magics 21.0的安装及使用
  12. 动感标题文字快闪(闪白特效)开场PR模板MOGRT
  13. CentOS 8使用 Kickstart配置 UEFI PXE 启动
  14. 洛伦兹吸引子 matlab,混沌蝴蝶——洛伦兹吸引子
  15. 程序员也要学英语——限定词、形容词和副词
  16. 大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)
  17. Oracle数据库:oracle内连接inner join on,多表查询各种自链接、内连接、外连接的练习示例
  18. 想要把邮件转换成PDF?整起!
  19. 使用google浏览器添加并翻译英文无字幕视频
  20. solidity 基础讲解

热门文章

  1. Python列表常用操作,浅拷贝及深拷贝
  2. 《小猪佩奇过大年》首映 导演解答“啥是佩奇”
  3. HTML|CSS之布局相关总结
  4. 你了解的工厂模式可能有误
  5. P2234 [HNOI2002]营业额统计
  6. 沉迷Link-Cut tree无法自拔之:[BZOJ2594][Wc2006]水管局长数据加强版
  7. 【运维小分享】整理Apache日志
  8. HDU1390 ZOJ1383 Binary Numbers
  9. windows下WMI使用C++查询用户硬件信息
  10. .NET深入学习笔记(2):C#中判断空字符串的4种方法性能比较与分析