手机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,…

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

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

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

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

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

添加第一个ssh key 就不多说了,不懂的可以自己查资料 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的,以及这些控件如何得知所包含元素的更改内容。 我想知道为什么在相关书籍中没有找到关于以下模式的任何信息,因为这是一个非常关键的机制。 那里的许多帖子建议通过调用以下命令来强制触发ChangeEv…

MVC详解

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

ES6之命令妙用

很多人都听说过ES6(也就是ECMAScript的新一代标准)并且对她充满了向往,下面通过一个ES6中小知识点——let命令,来解开她的神秘面纱,让大家初步认识一下ES6的语法规范。let命令属于ES6中的一个基本语法,与原…

VUE-搜索过滤器

先看看效果 首先引入 <script src"https://cdn.jsdelivr.net/npm/vue"></script> HTML部分 <div id"app"><input v-modelsearch /><ul v-if"searchData.length > 0"><li v-for"item in searchData&quo…

使用spring-session外部化Spring-boot应用程序的会话状态

Spring-session是一个非常酷的新项目&#xff0c;旨在提供一种更简单的方法来管理基于Java的Web应用程序中的会话。 我最近在spring-session中探索的功能之一是它支持外部化会话状态的方式&#xff0c;而无需费心诸如Tomcat或Jetty之类的特定Web容器的内部。 为了测试spring-s…

使用纯HTML和OmniFaces构建动态响应的多级菜单

最近&#xff0c;我不得不使用JSF 2.2创建一个响应式多级菜单。 要求&#xff1a;菜单应&#xff1a; 从后端使用动态结构创建 反应灵敏&#xff0c;例如对桌面和移动设备友好 有带有导航链接的子菜单项 支持触摸事件 支持键盘辅助功能 PrimeFaces的菜单不是一个选择。 实…

Membership学习(三)Membership Providers介绍[xgluxv]

本来想在第三篇文章里介绍一下 Membership的类的&#xff0c;不过现在中文msdn也出来了&#xff0c;所以就不写了&#xff0c;&#xff0c;直接到介绍Membership Providers。 Membership Providers提供了Membership数据源和服务之间的所有接口&#xff0c;在Asp.net2.0中…

Servlet技术

----Servlet是用Java语言编写的应用到Web服务器端的扩展技术&#xff0c;它先于jsp产生&#xff0c;可以方便地对Web应用中的HTTP请求进行处理。在Java Web程序开发中&#xff0c;Servlet主要用于处理各种业务逻辑&#xff0c;他比jsp更具有业务逻辑层的意义。 一。Servlet基础…

文件指针创建失败!File *fp失败

问题记录&#xff1a;项目是在所里边的vs2010上创建的&#xff0c;正常&#xff01;在自己的笔记本上使用vs13和19都一直报错&#xff01;指针一直为空&#xff01; 网上查了好久&#xff0c;试了很多方法都没有用&#xff01;最后发现是权限的问题&#xff0c;c盘下边创建不了…

前端开发:小程序--第一步

当我在接到小程序的项目的时候&#xff0c;几乎可以说是一脸懵因为对小程序的概念说实话是不太理解的&#xff0c;或者说理解的不太透彻&#xff0c;但是领导给项目说要完成&#xff0c;那没办法&#xff0c;还是要继续呀。 首先&#xff0c;我就想着先注册一个看看&#xff0…

EasyCriteria已演变为uaiCriteria。 新名称和更多功能

你好&#xff01;你好吗&#xff1f; 我很高兴宣布uaiCriteria的发布&#xff0c;EasyCriteria的演进。 确实需要更改框架名称吗&#xff1f; 是的&#xff0c;可悲的是。 我找到了另一个具有相同名称的框架 &#xff0c;这就是为什么我决定更改名称的原因&#xff08;我不希…

ajax方式下载文件

在web项目中需要下载文件&#xff0c;由于传递的参数比较多&#xff08;通过参数在服务器端动态下载指定文件&#xff09;&#xff0c;所以希望使用post方式传递参数。通常&#xff0c;在web前端需要下载文件&#xff0c;都是通过指定<a>标签的href属性&#xff0c;访问服…

了解Spring Web应用程序体系结构:经典方法

每个开发人员必须了解两件事&#xff1a; 架构设计是必要的。 花哨的体系结构图没有描述应用程序的真实体系结构。 真正的体系结构是从开发人员编写的代码中找到的&#xff0c;如果不设计应用程序的体系结构&#xff0c;最终将得到一个具有多个体系结构的应用程序。 这是否…

springmvc注解小示例(转)

转自&#xff1a;http://www.blogjava.net/pengo/archive/2010/11/28/339229.html 弃用了struts&#xff0c;用spring mvc框架做了几个项目&#xff0c;感觉都不错&#xff0c;而且使用了注解方式&#xff0c;可以省掉一大堆配置文件。本文主要介绍使用注解方式配置的spring mv…