手机MMI体系结构及其实现

摘自:http://blog.csdn.net/zc2007/article/details/2340436 

 

   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)) 1引言

    MMI(ManMachineInterface),即人机界面,它负责和用户的交互,在必要的时候调用其它模块的功能。MMI模块在整个系统中处于最高 层,主要实现人机交互的功能,即解释用户的各种命令并发消息到相应的处理模块,同时将系统接收到的各种消息或系统所处的状态以界面友好的方式反馈给用户。 它由管理人机界面交互的任务实现。MMI软件利用面向对象的程序设计方法,平台采用消息循环驱动机制,实现对下层核心代码的抽象、隔离和封装,从而使得 MMI软件同硬件平台和下层软件的相关性降低。在完成大型的应用软件开发过程中,便于分组分工合作。

    目前,各个手机厂商正在将越来越多的注意力集中到人机界面的设计上,力争提供给用户一个美观易用、功能齐全的操作平台。显示屏由原先的黑白小屏幕显示,发展为现在的真彩色大屏幕,存储容量也快速增长,硬件设备的高速发展,为人机接口的各种改进提供了可靠性。

    为了更好地实现上述功能,手机MMI软件应该做到以下几点。

    ·软件工作稳定可靠,与低层软件接口方便,以保证整机的性能。

    ·选用代码效率高,可移植性好的编程语言,以便提高产品的性能价格比,降低开发成本。

    ·运用图形、动画、汉化界面及汉字功能,美化产品、方便使用。

    ·精心组织程序结构,使软件结构清晰,各个模块独立性强、可扩充性高、可封装性好,便于开发小组分工合作以及各阶段开发成果的充分利用,缩短产品开发周期。

    本文围绕MMI软件架构和消息驱动机制,结合短消息的发送,粗略地对手机软件开发作介绍。

    2手机MMI应用程序的分层结构

    手机软件的主体系统架构由两部分组成:底层的操作系统、协议栈、协议驱动与上层的手机平台。

    手机性能的好坏直接取决于手机平台的搭建。好的平台能实现模块化管理,各个模块之间的独立性高,便于修改,节约成本。这里就涉及到人机界面的设计,我们把MMI应用程序自下而上分为三个层次,分别是抽象层、核心层和应用层。如图1所示。

    抽象层由操作系统抽象层(OSAL)、协议栈抽象层(PASL)和硬件抽象层(PSAL)组成。此模块可以将目标操作系统抽象出来,使核心层和应用层与目 标操作系统无关,实现良好的可移植性,缩短产品的开发周期,保证产品快速上市;也可以将目标平台的无线通信相关部分抽象出来,与协议栈通信,完成AT命令 的交互,可以提供与电话功能和SIM卡功能相关的操作,包括语音通话、短消息、小区广播、SIM卡数据访问、STK、PLMN网络注册等;也可以完成设备 抽象如液晶屏、键盘、音频播放器等,综合它们的共同点,与下层隔离。

    核心层是MMI程序的灵魂,在软件结构中起承上启下的作用。它主要由图形用户界面(GUI)、窗口管理、消息管理、应用引擎组成。引擎与界面无关,文件 I/O采用ANSIC标准,方便在各种系统上的移植。如短消息的引擎专门负责短消息的接收、分发、发送、存储和管理,它仅依赖于抽象层,向上层应用程序提 供一整套短消息相关的API,从而达到简化应用程序编程的目的,使界面定制更加方便快捷。关于窗口管理和消息管理下文将作详细的介绍。

    应用层是手机多样化的体现,厂家可以针对不同的消费群体量身定制。一般手机都提供短消息、通话、设置等基础应用,还包括照相、MP3等高级应用。

    3MMI软件的核心结构——消息循环机制及窗口管理

    MMI软件有一个主程序,主要作用是建立消息循环,负责分发消息。由于MMI软件采用面向对象的程序设计方法,平台采用消息循环驱动机制,实现对下层核心 代码的抽象、隔离和封装,从而应用程序的运行需要依靠外部发生的事件来驱动,即程序所做的一切都是响应发送给窗口过程的消息。如图2所示。

    一个简单的消息环含有下列函数的调用:GetMessage、TranslateMessage和DispatchMessage。

    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软件开发的整个过程模块可再用性好,便于开发小组分工合作。

转载于:https://www.cnblogs.com/jianghulang/archive/2012/04/03/2431257.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Aspose.Words简单生成word文档

Aspose.Words简单生成word文档 Aspose.Words.Document doc new Aspose.Words.Document(); Aspose.Words.DocumentBuilder builder new Aspose.W…

ubuntu下安装JDK和netbeans

我在ubuntu下安装netbeans十分简单,我下载了jdk-7u1-nb-7_0_1-linux-ml.sh,直接在终端输入 sh jdk-7u1-nb-7_0_1-linux-ml.sh安装的向导就会启动,你只要选择JDK和netbeans安装的目录,向导就自动替你安装jdk和netbeans,…

在带有组合框的值列表的下拉列表中显示显示属性的子集

组合框值列表(inputComboboxListOfValues)应该是使用LOV的非常流行的ADF Faces组件。 坦白说,这是我最喜欢的值列表方法。 在这篇简短的文章中,我将重点介绍ADF开发人员经常忽略的一项功能。 如果默认情况下定义了LOV,…

Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav

报错:Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: jav 原因:1、在对应的xml文件里面 #A#,只写了一个# 2、xml文件里面有多余的字符,如空格等 转载于:https://www.cnblogs.com/zzw3014/p/11316031.html

摆脱困境:在每种测试方法之前重置自动增量列

当我们为将信息保存到数据库的功能编写集成测试时,我们必须验证是否将正确的信息保存到数据库。 如果我们的应用程序使用Spring Framework,则可以为此目的使用Spring Test DbUnit和DbUnit 。 但是,很难验证是否在主键列中插入了正确的值&am…

仅坚持了9天:京东今日宣布暂停火车票代购业务

仅仅只坚持了9天,对于京东商城销售火车票的讨论一直进行着。不论是否具有销售资质,还是变相的收费。到今天下午为止京东商城发表声明暂停火车票代购业务。以下是京东公告全文:尊敬的京东网友:鉴于京东商城火车票代购业务测试期间出…

path.join 与 path.resolve 的区别

1. 对于以/开始的路径片段,path.join只是简单的将该路径片段进行拼接,而path.resolve将以/开始的路径片段作为根目录,在此之前的路径将会被丢弃,就像是在terminal中使用cd命令一样。 path.join(/a, /b) // a/bpath.resolve(/a, /b…

Android IPC系列(一):AIDL使用详解

概述 AIDL可以实现进程间的通信,由于每个进程都是运行在独立的空间,不同的进程想要交互需要借助一些特殊的方式,AIDL就是其中的一种,AIDL是一种模板,因为实际交互过程中,并不是AIDL起的作用,具体…

如何使用单例EJB,Ehcache和MBean构建和清除参考数据缓存

在本文中,我将介绍如何使用单例EJB和Ehcache在Java EE中构建简单的参考数据缓存。 高速缓存将在给定的时间段后重置自身,并且可以通过调用REST端点或MBean方法“手动”清除。 这篇文章实际上是在以前的文章的基础上建立的 。 唯一的区别是,我…

深入浅出React Native 1: 环境配置

该教程主要介绍如何用react native来开发iOS,所以首先,你需要有一台mac,当然黑苹果也是可以的~ 创建一个react native的项目只需要安装以下五个组件~~(但....坑爹的是,不FQ的话安装慢成狗呀) 1. 安装 xco…

C#排序算法大全

C#排序算法大全 土人 2004-7-21 一、冒泡排序(Bubble) using System; namespace BubbleSorter { public class BubbleSorter { public void Sort(int[] list) { int i,j,temp; bool donefalse; j1; while((j<list.Length)&&(!done)) { donetrue; for…

Spring实战(前言:Spring容器)

Spring容器&#xff0c;顾名思义是用来容纳东西的&#xff0c;装的就是Bean。Spring容器负责创建、配置、管理Bean。spring容器有两个核心接口&#xff1a;BeanFactory和ApplicationContext接口&#xff0c;后者是前者的子接口。在基于spring的Java EE程序中&#xff0c;所有的…

具有WildFly,Arquillian,Jenkins和OpenShift的Java EE 7部署管道

技术提示&#xff03;54展示了如何Arquillianate&#xff08;Arquillianize&#xff1f;&#xff09;一个现有的Java EE项目并在WildFly在已知主机和端口上运行的远程模式下运行这些测试。 技术提示&#xff03;55展示了当WildFly在OpenShift中运行时如何运行这些测试。 这两个…

《那些年啊,那些事——一个程序员的奋斗史》——88

谁也不知道武总脑袋里面会想些什么。这天早上段伏枥还在发愁如何改进这4.3机器的电源管理的时候&#xff0c;武总突然让自己到会议室开会。 段伏枥还没坐下来的时候&#xff0c;武总推过来一台机器&#xff0c;说:“你看看&#xff0c;这机器怎么样。” 段伏枥定睛一看&#xf…

css浮动(float)及清除浮动的几种实用方法

CSS浮动是现在网页布局中使用最频繁的效果之一,而浮动可以帮我们解决很多问题,那么就让我们一起来看一看如何使用浮动. 一.css浮动(float) (1)html文档流 自窗体自上而下分成一行一行&#xff0c;并在每行中按从左到右的顺序排放元素。 (2)网页中大部分对象默认是占用文档流…

一台电脑同时添加git和bitbucket两个网站的ssh key

添加第一个ssh key 就不多说了&#xff0c;不懂的可以自己查资料 ssh-keygen -t rsa -C email_1email.com 然后一路enter就好了 假设已经添加好了git的ssh key 。现在要添加bitbucket的ssh key 首先 ssh-keygen -t rsa -C email_2email.com //同一个邮箱也可以 然后指定公钥的…

属性提取器:获取ListView即时更新其元素的最佳方法

这篇文章是关于如何处理JavaFX ListViews和TableViews的&#xff0c;以及这些控件如何得知所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息&#xff0c;因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来强制触发ChangeEv…

基于python语言下的UI自动化测试框架搭建(四)

testsuits:案例执行 创建baidu_search1.py文件&#xff0c;这里会展示两种执行方式&#xff0c;一种是直接调用base_page中封装好的常用操作方法&#xff0c;另外一种是先调用baidu_homepage.py&#xff0c;通过baidu_homepage.py进行处理&#xff0c;再执行对应的案例&#xf…

MVC详解

模型&#xff0d;视图&#xff0d;控制器&#xff08;Modal View Controler&#xff0c;MVC&#xff09;是Xerox PARC在八十年代为编程语言Smalltalk&#xff0d;80发明的一种软件设计模式&#xff0c;至今已被广泛使用。最近几年被推荐为Sun公司J2EE平台的设计模式&#xff0c…

如何为每个URL连接设置自定义SSLSocketFactory的TrustManager

从javadoc中我们可以看到javax.net.ssl.HttpsURLConnection提供了一个静态方法来用setDefaultSSLSocketFory&#xff08;&#xff09;方法覆盖。 这样&#xff0c;您就可以提供一个自定义javax.net.ssl.TrustManager&#xff0c;它可以验证您自己的CA证书握手和验证等。但是&am…