第36卷 第12期 福 建 电 脑 Vol. 36 No.12
2020年12月
Journal of Fujian Computer
Dec. 2020
———————————————
程文帆(通信作者),男,1987年生,主要研究领域为物联网、嵌入式系统。E-mail:******************* 。
Android 系统中软件状态机的使用研究
程文帆
(厦门城市职业学院 福建 厦门 361008)
摘 要 本文基于Android 应用的开发需要介绍了状态机的基本概念,对普通软件状态机的特点进行分析,并分析了模块化使用软件状态机的必要性,同时还对Android 系统提供的状态机管理模块进行介绍。 关
键词 状态机;Android ;软件;设计模式
中图法分类号 TP399 DOI:10.16707/jki.fjpc.2020.12.014
Research on the Use of Software State Machine in Android System
CHENG Wenfan
(Xiamen City University, Xiamen, China, 361008)
Abstract This paper introduces the basic concepts of state machines based on the development needs of Android applications. The characteristics of common software state machines and the necessity of modularized use of software state machines are analyzed. This paper also introduces the state machine management module provided by the Android system.
Keywords State Machine; Android; Software; Design Pattern
1引言
在Android 应用的开发过程中,经常会遇到需要依据不同的状态,执行状态对应的响应。例如,在一
个基于Android 的智能手表系统中,需要应用一个状态来表示系统的电源模式(省电模式或全速模式),在不同的电源模式状态下,各个模块有不同的执行响应,以把握系统的性能与耗电。这种逻辑简单的状态判断,可以直接利用文件存储、系统属性、全局变量等方法来表征电源状态并直接进行查询处理,简单有效。
如果需求相对复杂,则会出现问题。例如,考虑到智能手表的显示区域有限,计划设计一个仿照传统电子手表的设置功能,即只使用两个触屏按钮来完成手表的所有功能设置。这个双按钮设置机制的状态不会太复杂,但实现起来已然开始变得繁琐,开发人员必须小心对状态需求进行归纳分析,才能保证系统逻辑的正常。
传统的控制策略在实现复杂逻辑时会显著提高软件复杂度,降低逻辑可读性与裁剪便捷性[1]。所以,使用专门的状态机的思想来统一维护管控系统中各种状态的运行,是一种更为妥当的方案。
2状态机的基本概念
2.1状态机基本知识
状态机(State Machine)是一种用来进行对象行为建模的工具,主要作用是描述对象在生命周期内所经历的状态序列,以及如何响应来自外界的各种事件[2]。它由四个要素组成:“现级状态”、“次级状态”、
“状态转换条件”、“执行响应”。其中,“次级状态”是“现级状态”的子状态,“现级状态”是“次级状态”的父状态。从“现级状态”转换到“次级状态”,这个状态转换的触发条件就是“状态转换条件”。一个状态机系统是通过统一管理系统中各个状态的执行响应以及各种状态之间互相转移的触发条件,来实现这个状态机系统业务逻辑的正
58 程文帆:Android系统中软件状态机的使用研究第12期
常运转。
图1 一种智能洗衣机的运行状态机图例
以图1描述的一种智能洗衣机的运行状态转移图为例。“现级状态”就是工作流程在当下所在的工作状态,比如洗衣机在洗涤衣物时所在的就是“洗涤”状态。在“洗涤”状态下,洗衣机对衣物进行洗涤,这个动作就是对当前工作状态的一种“执行响应”。此外,根据洗涤时长和机器配备的传感器采集到的相关指标信息,可以将系统状态跳转到“脱水”甩干状态。这个脱水状态就是相对于“洗涤”状态的次级状态,而状态间跳转的条件,是由各个传感器获取的系统运行信息所组成的。维护好各种状态的内部逻辑和状态间的跳转关系,就可以使系统运行正常。
状态机是一种规范的状态管理模式,在硬件和软件设计当中都广泛存在。
对于硬件设计,状态机展现出的是一种系统的、全局的时序逻辑的思想。它帮助数字电路,克服其缺少CPU进行顺序执行的机制,利用寄存器与组合逻辑电路组成的数字状态机来完成顺序执行功能[3]。所以,几乎所有的数字硬件逻辑设计,都使用到了状态机。
2.2软件状态机常见架构及问题
对于软件设计来说,状态机则相对比较低调。在Android系统中,软件状态机的一种典型的实现方式如图2、图3所示。
图2描述了这种软件状态机实现的框架代码。其中,用线程Thread来支撑状态机运行的平台,并在线程中使用while(1)来实现循环地对状态进行查询筛选,同时实现对应状态的执行响应。
图3描述了这种软件状态机进行状态的筛选与处理的代码细节示例。从代码的总体框架上看,这类软件状态机使用了switch/case或if/else条件选择语句进行状态筛选与条件执行,通过对“现级状态”state变量以及其他条件进行统筹判断,可完成状态从“现级状态”向“次级状态”的调整以及状态的“执行响应”。此外,这类软件状态机一般使用各种变量来表征状态、条件、信息等数据,并直接将这些变量耦合进状态筛选和执行逻辑的代码中。
图2 一种软件状态机的典型框架
图3 一种软件状态机状态筛选与处理的代码
在状态数量较少的应用系统中,这种状态机还算简洁有效,但若应用场景的状态数量较多,且对应的逻辑又相对复杂的情况下,这种状态机的缺点是明显的。此时,整个状态机从代码布局上看混在了一起,代码中消息、条件、状态的变量和处理逻辑“散落”在各处。其业务逻辑和状态机内部逻辑耦合性过大的缺点被放大了,不仅看上去显得十分“丑陋”,而且开发以及维护的工作量也会随着状态数量的增多而同步增长。
代码的可读性变差,开发人员在修改维护的时
候容易出错,这种情况不符合良好软件设计模式的
2020年福建电脑59
要求[4]。所以,模块化、有层次、模式重构的软件
状态机是一种更好的追求。
3基于Android的状态机
3.1状态机的基本框架
Android是一款优秀开源的操作系统,广泛地
应用在手机、平板、电视、手表等消费类智能设备
当中。针对状态机的使用和维护,Android系统在
framework层提供了专门的StateMachine状态机类来完成这个功能。相对于前面介绍的一般软件状态机,这个由Android系统提供的模块化状态机具有十分明显的优势。在Android系统中,WiFi模块与蓝牙模块都使用了这个StateMachine状态机类来辅助实现它们相对复杂的状态管控与逻辑执行[5]。
Android系统自带的StateMachine状态机主要包括以下源文件:IState.java、State.java、StateMachine.java、StateInfo.java。源文件中主要的模块有两个,一个是IState状态接口,另一个是StateMachine状态机制的实现类。
图4 Android状态机的状态的接口IState 其中IState接口描述了一个状态的基本功能接口,其简化代码如图4所示。实际应用场景的状态对象,可以通过对IState接口的继承并重写内部的功能函数,来完成对实际状态对象的定制。状态内部可重写的业务逻辑函数有三种,其中enter()和exit()函数,是系统进入某个状态或离开某个状态时会执行的函数,它们为用户在状态转入时刻与转出时刻提供了逻辑处理的空间;processMessage函数是状态的消息处理函数,它既是状态完成“执行响应”的地方,也是状态与外界沟通的唯一桥梁。外界可以将各种信息通过消息(Msg)传达给状态机中的“现级状态”,此“现级状态”就可以根据定制的processMessage函数完成对应消息的“执行响应”。从IState接口的内容可以得到状态内部的总体运作流程如图5所示。
图5 Android状态机中状态State的内部流程图
IState接口作为Android StateMachine状态机的状态原型,很好地引导每个继承状态都各自分门别类地收纳起来,避免了类似switch/case状态机中代码布局上的混乱。这在状态数量庞大的系统中特别有利。而另一个关键模块StateMachine类,则是实现了状态机各个状态间运行的机制,它围绕状态机中的各个状态State完成逻辑流转。StateMachine类的简化代码如图6所示。
图6 StateMachine类代码摘要
从图6可以看出,StateMachine类中的核心的元素是“状态信息”StateInfo。它里面不仅包括了具体的单个状态对象State,还包含有此状态的活动情况(active)以及它的父级状态的信息。同时,定义了一个HashMap将各个“状态信息”StateInfo用链表形式组织管理起来。通过这个链表,状态机可以访问到所有的状态及其状态对象的业务逻辑,层次分明。
60 程文帆:Android系统中软件状态机的使用研究第12期
从StateMachine类的构建函数可以看出,其运行框架是基于一个Android的HandlerThread类。这个类的本质就是一个具有Handler/Looper的运行线程,也就是在一个线程当中维护一个循环处理的消息队列[6],外界可以通过发送消息,将信息传递分发给“现级状态”中的消息处理函数processMessage()进行处理,完成状态的“执行响应”。这里的消息机制很好地将外界与内部逻辑进行了解耦。
此外,StateMachine类还提供了状态机的相关操作函数:(1)通过addState函数可以将自定义的状态state加入到状态机的HashMap链表中,用来完成状态集合的组建;(2)使用transitionTo函数可以通知状态机进行状态跳转;(3)另外,使用setInitialState可以设置状态机的初始状态。综合来看,Android StateMachine状态机类的处理流程如图7所示。
图7 StateMachine状态机类的处理流程图
制作android软件流程3.2 Android状态机的应用
通过对Android系统提供的StateMachine状态机的框架源码分析,可总结出其使用步骤就是:(1)自定义状态,并根据实际应用需求重写各种状态的处理函数;(2)将各个定制的状态用addState函数加入到状态集合当中;(3)调用setInitialState函数来设置状态机的初始状态;(4)启动状态机,状态机正常运行,此时状态机外部可以通过sendMessage将消息发送“现级状态”处理,同时也可以通过调用transitionTo函数通知状态机进行状态跳转。
可以看到,Android系统提供的StateMachine 状态机相对于一般的switch/case软件状态机,优势明显:它可以将状态和消息处理模块化,从使用的角度上看有利于分门别类的管理大批量的状态;各种状态机的处理方法不会混在一起,代码的耦合性低;功能的开发调试上,会变得相对简单。
4结束语
软件开发中状态机的使用场景十分广泛,“switch/if/else”形式的软件状态机使用时简单灵活,但在大体量状态应用的情景中具有很大的劣势。本文介绍了状态机的基本概念和一般软件状态机目前存在的问题,对比分析了普通软件状态机和Android系统framework提供的StateMachine软件状态机的源码特点。Android自带的模块化状态机,架构层次分明,结构清晰,耦合性低,给Android 学习者与开发人员在选择使用软件状态机时提供了一种很好的选项,使开发过程事半功倍。
参考文献
[1] 刘军,杨俊杰.状态机策略在加油机控制系统中的应用.电子制作,
2020(02):67-69
[2] 杨涛存,郭剑峰,杜文然,等.基于有限状态机模型的供电故障断电区间
快速提取方法.中国铁路, 2020(08):7-12
[3] 石惠敏,方振国,陈建国,等.状态机的模块化设计.长春师范大学学报,
2019,38(12):24-29
[4] 何红辉,关爱民.Android源码设计模式解析与实战.北京:人民邮电出
版社, 2015
[5] 邓凡平.深入理解Android:WiFi模块、NFC和GPS卷.北京:机械工业
出版社, 2014
[6] 邓凡平.深入理解Android:卷I.北京:机械工业出版社
, 2011
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论