最近在做类似微信多人语音,视频聊天功能,用到了Android的状态机,借此写写自己的理解

状态模式

对状态模式的理解:

不同的状态对应不同的行为,当一个对象的状态改变了,那么该对象的行为也随之改变!通过将状态封装成一个类,然后去控制对象的行为,这就是状态模式!

解决什么问题:

一个事物有很多种状态,如果不使用状态模式,那么在执行具体的操作的时候,就会有很多的if/else 或者switch/case判断,如果有很多状态,那么在每个功能函数就会有很多的语句嵌套,增加的代码的复杂度,不利于维护!

应用:
1.电梯的运作
2.电视遥控机的操作
3.语音/视频通话流程
4.APP访客模式与用户模式的相关操作
5.WI-FI状态机制
……..

Android状态机

StateMachine 是Android com.coreget.call.util下的一个类,是用来专门用来处理状态机的一个类,在FrameWork层有很多使用,比如蓝牙,WI-FI相关的状态机都有用到StateMachine!

StateMachine的使用

1.拷贝源码到自己的工程(没有开放)
2.写一个类继承StateMachine
3.定义自己的状态,并初始化状态:
class IdleState extends State {@Overridepublic void enter() {//进入该状态  }@Overridepublic boolean processMessage(Message msg) { //状态的信息处理switch (msg.what) {case SINGLE_MSG_CALLIN:    //延迟发送一个消息,直到进入下一个状态 deferMessage(msg);//从该状态跳转到另外一个状态transitionTo(mTerminateState); default:Log.d(TAG,msg.what+" when IdleState");}//是否处理该消息,false不处理,那么该消息将交给父节点处理return true;}@Overridepublic void exit() {//退出该状态 }
}CallStateMachine(String name) {super(name);//加入状态,初始化状态。 StateMachine的状态是一个树形的结构,每个状态只能直接的跳转到上一个或者下一个状态addState(mIdleState, null);addState(mCallingState, null);addState(mProceedingState, null);setInitialState(mIdleState);start(); // 状态机进入初始状态等候外界的命令
}

StateMachine的原理

StateMachine实现了Istate接口,实现了几个方法:

 @Override
public void enter() {
}/* (non-Javadoc)* @see com.android.internal.util.IState#exit()*/
@Override
public void exit() {
}@Override
public boolean processMessage(Message msg) {//用来执行具体的操作return false;
}

StateMachine内部使用了Handler,processMessage最终也是通过Handler来进行消息的转发与处理!

addState

将定义的所有的状态存放到HashMap<State, StateInfo> mStateInfo中

start

虚拟机准备好了,调用start()方法:初始化存放StateInfo到栈mStateStack,mStateStack是一个数组,后面的状态的跳转就是通过mStateStack的完成的!

transitionTo

进行状态间的跳转, 通过 mSmHandler.transitionTo(destState);设置了destState的值,并没有马上进行跳转,下次处理消息的时候,@Overridepublic final void handleMessage(Message msg) {if (!mHasQuit) {//处理状态的跳转performTransitions(msgProcessedState, msg);}}}performTransitions最终进行入栈出栈的操作,来处理状态间的跳转!StateMachine内部是树形结构,所以入栈出栈都是沿着节点进行的,如果状态节点不是直接关联节点,是不能直接跳转的!

deferMessage

延迟发送一条消息,直到进入下一个状态,用来状态间通信的!

这里大概讲了一下原理,没有详细对源码进行分析!

微信多人语音

对于微信多人语音功能,我们使用StateMachine状态机来维护我们的几个状态:
1.IdleState 空闲状态
2.CallingState 呼叫状态
3.ProceedingState 通话状态
4.TerminateState 结束状态(可有可无)

架构

1.底层信令到来触发StateMachine状态机的运作,StateMachine状态机触发业务逻辑层执行具体的操作

底层信令---->StateMachine----->业务逻辑层

2.业务逻辑层也可以发起通话操作,经过StateMachine状态机将具体信令传递到底层信令

底层信令<----StateMachine<-----业务逻辑层

这样实现分工明确,利于通话的状态维护,解耦实现!

状态模式/Android状态机/微信多人语音相关推荐

  1. 设计模式:状态模式与状态机

    文章目录 前言 状态模式 实现 状态机 概念 状态 事件 动作 实现技巧 实战 分析 总结 前言 在工作时遇到了这样一个需求: 控制消毒柜: 1. 当柜门打开时,关闭消毒,并重置已消毒时间: 2. 当 ...

  2. android 状态模式,Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...

  3. 【设计模式】状态模式(状态机)

    先介绍下状态机,状态机一般由三部分组成:状态(State).事件(Event).动作(Action).其中,事件也称为转移条件(Transition Condition).事件 触发 状态的转移及动作 ...

  4. 设计模式 - 状态模式(状态机)

    有限状态机(英语:finite-state machine,缩写:FSM) 有限状态机又称有限状态自动机(英语:finite-state automation,缩写:FSA),简称状态机,是表示有限个 ...

  5. 设计模式-状态模式实现状态机

          1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的 ...

  6. android模拟微信聊天功能,android仿微信聊天界面 语音录制功能

    本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 android:layout_width="fill_parent" and ...

  7. JS模式--状态模式(状态机)

    下面的状态机选择通过Function.prototype.call方法直接把请求委托给某个字面量对象来执行. var light = function () {this.currstate = FSM ...

  8. android 仿微信聊天界面 以及语音录制功能,Android仿微信录制语音功能

    本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下 前言 我把录音分成了两部分 1.UI界面,弹窗读秒 2.一个类(包含开始.停止.创建文件名功能) 第一部分 由于6 ...

  9. 有限状态机(使用状态模式C++实现)

    最近在研究怪物的AI,由于怪物的AI是使用有限状态机来实现的.所以就查看关于有限状态机的东西.根据这几天的查看资料,知道了有限状态机是计算机科学中一个很重要的概念.而且有限状态机是一个抽象的概念,具体 ...

最新文章

  1. ios 代码设置控件宽高比_用宽高比调整UIImage的大小?
  2. HDU3371(最小生成树)
  3. CTFshow 命令执行 web66
  4. Linux学习:gcc 编译工作流程
  5. java程序中没有错,但是项目上面显示一个红叉的解决办法
  6. spring mvc学习(3):建立第一个动态web项目
  7. Python的多行输入与多行输出
  8. 苹果失策?新iPhone捆绑Apple TV+或会致硬件利润率下滑
  9. Python学习【第二篇】 : Python入门
  10. Mysql——数据查询
  11. sourceInsight
  12. CentOS 6.5 yum安装mysql5.6或其他版本【默认yum只能安装mysql 5.1】 by jason
  13. 谁更胜一筹?技德Remix VS 凤凰OS
  14. 以云服务器产品为例,深度分析比对华为云、阿里云、腾讯云
  15. 参数化曲线-微分几何
  16. java 调用felix_使用eclipse开发felix的OSGI插件
  17. 山西省将率先实现全覆盖社保“一卡通”
  18. redis-replicator使用的一点点心得
  19. LTspice基础教程-001.软件简介与安装
  20. AR/VR训练营(无锡站)签约挂牌仪式成功举行

热门文章

  1. python多态_Python多态
  2. App Store “我们未能完成您的购买”解决方法_Mac
  3. Android应用记录一:有道翻译API调用
  4. Allegro中如何把默认单位和默认测量单位改为毫米啊
  5. java web 聊天室_Java和WebSocket开发网页聊天室
  6. uniapp启动图和引导页的处理逻辑
  7. 杰理之批量生产通话效 果忽大忽小,有 电流声【篇】
  8. BMI(体重健康指数)
  9. S5P4418 android 5.1 EC20 R2.0 PCIE接口调试记录
  10. HDU4768 Flyer