手机MMI体系结构及其实现
1引言
MMI(ManMachineInter-face),即人机界面,它负责和用户的交互,在必要的时候调用其它模块的功能。MMI模块在整个系统中处于最高层,主要实现人机交互的功能,即解释用户的各种命令并发消息到相应的处理模块,同时将系统接收到的各种消息或系统所处的状态以界面友好的方式反馈给用户。它由管理人机界面交互的任务实现。MMI软件利用面向对象的程序设计方法,平台采用消息循环驱动机制,实现对下层核心代码的抽象、隔离和封装,从而使得MMI软件同硬件平台和下层软件的相关性降低。在完成大型的应用软件开发过程中,便于分组分工合作。
目前,各个手机厂商正在将越来越多的注意力集中到人机界面的设计上,力争提供给用户一个美观易用、功能齐全的操作平台。显示屏由原先的黑白小屏幕显示,发展为现在的真彩色大屏幕,存储容量也快速增长,硬件设备的高速发展,为人机接口的各种改进提供了可靠性。
为了更好地实现上述功能,手机MMI软件应该做到以下几点。
·软件工作稳定可靠,与低层软件接口方便,以保证整机的性能。
·选用代码效率高,可移植性好的编程语言,以便提高产品的性能价格比,降低开发成本。
·运用图形、动画、汉化界面及汉字功能,美化产品、方便使用。
·精心组织程序结构,使软件结构清晰,各个模块独立性强、可扩充性高、可封装性好,便于开发小组分工合作以及各阶段开发成果的充分利用,缩短产品开发周期。
本文围绕MMI软件架构和消息驱动机制,结合短消息的发送,粗略地对手机软件开发作介绍。
2手机MMI应用程序的分层结构
手机软件的主体系统架构由两部分组成:底层的操作系统、协议栈、协议驱动与上层的手机平台。
图1
手机性能的好坏直接取决于手机平台的搭建。好的平台能实现模块化管理,各个模块之间的独立性高,便于修改,节约成本。这里就涉及到人机界面的设计,我们把MMI应用程序自下而上分为三个层次,分别是抽象层、核心层和应用层。如图1所示。
抽象层由操作系统抽象层(OSAL)、协议栈抽象层(PASL)和硬件抽象层(PSAL)组成。此模块可以将目标操作系统抽象出来,使核心层和应用层与目标操作系统无关,实现良好的可移植性,缩短产品的开发周期,保证产品快速上市;也可以将目标平台的无线通信相关部分抽象出来,与协议栈通信,完成AT命令的交互,可以提供与电话功能和SIM卡功能相关的操作,包括语音通话、短消息、小区广播、SIM卡数据访问、STK、PLMN网络注册等;也可以完成设备抽象如液晶屏、键盘、音频播放器等,综合它们的共同点,与下层隔离。
核心层是MMI程序的灵魂,在软件结构中起承上启下的作用。它主要由图形用户界面(GUI)、窗口管理、消息管理、应用引擎组成。引擎与界面无关,文件I/O采用ANSIC标准,方便在各种系统上的移植。如短消息的引擎专门负责短消息的接收、分发、发送、存储和管理,它仅依赖于抽象层,向上层应用程序提供一整套短消息相关的API,从而达到简化应用程序编程的目的,使界面定制更加方便快捷。关于窗口管理和消息管理下文将作详细的介绍。
应用层是手机多样化的体现,厂家可以针对不同的消费群体量身定制。一般手机都提供短消息、通话、设置等基础应用,还包括照相、MP3等高级应用。
3MMI软件的核心结构——消息循环机制及窗口管理
图2
MMI软件有一个主程序,主要作用是建立消息循环,负责分发消息。由于MMI软件采用面向对象的程序设计方法,平台采用消息循环驱动机制,实现对下层核心代码的抽象、隔离和封装,从而应用程序的运行需要依靠外部发生的事件来驱动,即程序所做的一切都是响应发送给窗口过程的消息。如图2所示。
一个简单的消息环含有下列函数的调用:GetMessage、TranslateMessage和Dispatch-Message。
while(GetMessage(&msg,NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
当收到来自底层的开机消息时,MMI软件进行初始化并创建基本窗口。基本窗口可以看作是MMI层所有窗口的“根”,其它窗口都是这个窗口的子窗口。到达MMI层的消息,其它窗口不处理时,都送到基本窗口中作缺省处理。在基本窗口中,根据不同的情况,进行状态转换,分别创建等待、充电、等待插入SIM卡、等待输入PIN(个人识别号)等子窗口,处理开机及关机过程中的各项工作。顺利完成各项开机工作后,转入待机状态,创建待机窗口。待机窗口可以完成拨号、启动快捷键等工作,也可以进一步创建电话本等子窗口。如果因接听来电或拨打电话进入通话状态,取消待机窗口,创建通话窗口。
菜单窗口可以派生出一系列子窗口,形成一颗菜单树,这个菜单树把手机的各种功能有机组织在一起。各个菜单窗口都是菜单窗口类的实例。菜单的选择、显示等功能都在菜单类中完成。
GUI(图形用户界面)系统为MMI应用程序提供了以窗口为核心的用户界面和消息事件驱动的实现机制。GUI窗口管理模块为对话窗口、菜单、编辑及其他用户输入输出操作提供了一个基本框架,为消息处理提供了基本手段。窗口管理收集所有的输入信息,然后把这些输入信息以消息的形式送往合适的窗口,由该窗口的处理函数处理。
窗口消息在窗口函数中处理。每个窗口类都必须有一个窗口函数。MMI应用程序只要负责创建窗口、处理窗口产生的高级事件及窗口的异常情况。在这个环境中,用户可以对消息作处理,也可以作缺省处理。窗口管理把来自键盘和软件中其它实体的消息送到具有当前焦点的窗口。在软件的整个运行过程中,总存在一个具有焦点的窗口,它负责处理输入消息,或者把消息沿着从子窗口到父窗口方向的链表送到一个可以处理该消息的窗口。
应用程序必须删除和处理投递到它的线程消息队列中的消息,单一线程的应用程序一般在它的入口函数中使用一个消息环来删除消息,并把消息发送到相应的窗口过程进行处理。具有多重线程的应用程序在创建窗口的每一个线程中使用一个消息环。
4MMI层消息的产生及处理
MMI消息主要包括按键事件消息、协议栈消息及自定义消息等。GUI从几个源产生和获取消息,由底层键盘的输入消息;也可以由GUI系统产生(如通过GUI提供的API函数调用或GUI系统为了响应应用程序给系统带来的变化,如窗口大小的改变),大多数这类消息是发送而不是投递的;也可由应用程序的运行来产生,一个应用程序可以投递消息到自己的队列或其它应用程序的队列中去,也可以直接把消息发送到自己的窗口或其它应用程序的窗口中去。
GUI系统有两种方式向窗口过程发送消息:把消息投递到一个先进先出的消息队列,它是系统定义的内存块用于临时存储消息;或是把消息直接发送给窗口过程。GUI系统要用到消息队列,它要管理一个系统消息队列和任意数目线程消息队列,每个队列对应一个线程。
5短消息的发送实例
图3
下面以短消息发送为例简要说明。用户点击“短消息”菜单,进入短消息列表窗体。按“OK”键进入短消息编辑窗体,从而编写短消息的内容。编写完毕,点击“确定”,进入联系人窗体。最后,确认联系人号码进入发送窗体。传递的机制如图3所示。
图4
短消息发送程序涉及到很多模块,如何建立良好的通信机制是关键。程序中运用了回调函数和事件传送机制。如图4所示。
在回调函数的处理中,键盘事件的处理是最重要的。通常键盘事件被具有输入焦点的窗体首先获得,它如果处理这个键盘事件,在键盘回调函数中截获该键盘事件,否则将此键盘事件按照消息队列,向上层窗口传递,直到有一个窗体将它截获。由于编辑窗体使用的是编辑框窗口类,编辑框窗口类封装良好,使得它本身可以处理大部分键盘事件(如数字输入、文字输入等),但总有一些事件要进行特殊的处理以满足窗体的不同需求,这时需要与窗体之间进行通信。
6结束语
本文介绍的这种软件设计方法层次清晰、简洁,结构比较完善,有利于在较短的时间内开发出符合要求的移动终端软件。同时,进行MMI软件开发的整个过程模块可再用性好,便于开发小组分工合作。
posted on 2010-07-21 14:33 Hibernate4 阅读(426) 评论(0) 编辑 收藏 举报