设计可靠的应用程序以利用基于 Windows CE 的 Smartphone 设备

发布日期: 1/11/2005 | 更新日期: 1/11/2005

Chris Dellinger

本文假定您熟悉 C++,Windows CE 和 XML

摘要

随着人们愈渐熟练地使用 Microsoft 开发工具来开发出最先进的移动电话应用程序,Smartphone 应用程序有望成为新一轮移动电话发展热潮的顶峰。 由于智能电话是基于 Windows 的设备,开发人员可以通过简单且成本低的方式为移动电话用户扩展新的和历经考验的应用程序。 这些应用程序将拥有必要的企业级功能,同时通过使用多种易于使用的 API 集成移动电话的各种功能。 本文将介绍构建 Smartphone 实际业务应用程序的基础知识。

*

目前,已经在欧洲发布了 Windows®-powered Smartphone 版本,预计该版本将于 2003 年上半年在美国发布,从而树立起移动电话应用程序开发的旗帜。 Smartphone 是一种优秀的移动电话,可以在熟悉的 Windows 环境中提供语音、无线连接和 Internet 访问的能力。 Smartphone 设备与现有的移动电话不同,它有用于添加内存和硬件的扩展槽,使您能够通过 ActiveSync® 与桌面电脑同步,并提供即时消息、Outlook® 联系人和日历、统一的“收件箱”等功能。 智能电话的最佳之处在于将这些功能集成在一个与现有移动电话一般大小的设备中。

由于 Smartphone OS 以 Windows CE 3.0 为基础,因此,开发人员可以使用之前在 Pocket PC 中进行开发时一直使用的相同的工具和 API,迅速地构建各种多样的、强大的、激动人心的应用程序。 尽管对 Smartphone 而言,其大部分市场在于游戏和个人开发工具,但是在企业级应用领域也将有着广阔的开发舞台。 为员工提供移动电话有许多好处,Smartphone 则通过允许员工访问内部企业应用程序(无需昂贵的硬件),从而可以充分利用这些好处。 此外,目前就可以开发出将现有功能与电话相结合的新型应用程序。

在本文中我将构建一个 Smartphone 实际业务应用程序。 有关本文范围之外的主题的信息,例如语音识别、即时消息及 Pocket Outlook,请查看 http://www.microsoft.com/mobile

Smartphone 与 Pocket PC Phone Edition

您可能已经听说过另外一个基于 Microsoft® 软件的 Pocket PC Phone Edition。 为了避免混淆,我将详细说明 Pocket PC Phone Edition 与 Smartphone 之间的区别。 For a look at the differences between the two, see 图 1。 (如果您有兴趣了解有关构建 Smartphone GUI 的更为详细的信息,请查看“开发高效的 Smartphone 用户界面”。) Pocket PC Phone Edition 是一款功能全面的内置移动电话功能的 Pocket PC 设备,大小与其它的 Pocket PC 设备相近,机身比 Smartphone 要大一些。 Pocket PC Phone Edition 比 Smartphone 具有更大的功率和更多的内存。此外,它有一个比常见的 Smartphone 显示屏(它不支持触摸屏技术)更大的触摸屏。 处理用户与设备交互的方法也不同: Pocket PC Phone Edition 使用触摸屏手写笔进行交互,而 Smartphone 使用电话的小键盘。

fig01

图 1 屏幕

哪种类型的设备最适合于您的需要取决于三个主要因素: 成本、功能及易用性。 Microsoft 估计智能电话的定价与其它的高端移动电话相近,比 Pocket PC Phone Edition 设备低。 你需要的功能依赖于应用程序设计成做什么的。对于多数移动应用程序,Smartphone 和 Pocket PC Phone Edition 执行的情况相同。 但是,如果应用程序需要大量的磁盘空间和内存、附加的硬件或者更大的屏幕,Pocket PC Phone Edition 也许是正确的选择。

设备和在其之上运行的应用程序是否易于使用,在很大程度上取决于数据输入问题。 首先,你必须决定使用手写笔还是小键盘,或者使用何种输入方式根本不重要。 通过菜单选项的数据输入易于被其它设备处理。 但是,对于输入文本信息,Pocket PC Phone Edition 明显更简单易用。 幸运的是两种设备都支持 Windows CE API,使您能够轻松自如地为它们建立一个代码基。

构建 Smartphone 应用程序

实际的 Smartphone 应用程序需要实现哪些功能? 好,在大多数移动业务应用程序中有一些共同的任务。 它们包括从远程数据存储中检索数据、处理数据、在本地离线储存和管理数据、上载更改并与电话功能进行交互。如果您能够在需要时理解并构建这些元素,就能够进行实际的 Smartphone 开发。

构建您的应用程序的第一步是下载 Smartphone 2002 SDK 的一份副本。 下一步是决定将构建的应用程序的类型: 基于浏览器的还是独立的。

Smartphone 上的基于浏览器的解决方案由可被 Pocket Internet Explorer 访问的Web内容组成。 对那些希望将其内容提供给 Smartphone 持有者的内容提供商而言,这种类型的应用程序是最好的选择。 由于所有的代码都驻留在Web服务器上,因此 Smartphone 上的基于浏览器的应用程序具有与其它平台所提供的相同的好处(包括简单的软件分发和维护)。 当然它也存在缺点,其中之一是它并不能保证始终连接到 Internet。 另一个缺点是 Pocket Internet Explorer 应用程序不能访问该设备的内置功能或与其进行交互。 但幸运的是,可以使用现有的 Web 开发工具包(如 ASP.NET Mobile Controls)来开发基于浏览器的应用程序。

与Web应用程序不同,您可以使用诸如 eMbedded Visual C++® 等工具来开发一个自定义应用程序。 (也可以从 http://www.microsoft.com/mobile/developer下载)。 幸运的是 Smartphone 与 Pocket PC 平台相似。 由于大多数 API 相同,因此可以将使用 eMbedded Visual C++ 为 Pocket PC 平台编写的现有应用程序简单地移植到 Smartphone 上,这样,就可以为那些希望在两种设备上部署一个单一应用程序的组织节省大量的成本。 我已经移植了两个应用程序: 一个只需要简单地重新编译,另一个只花了几个小时来解决平台之间的细微区别。

在开发独立的应用程序时您有更大的灵活性,而且这类应用程序往往更加可靠,并且在连接和未连接模式中均能使用。 对多数商业应用,独立的应用程序也许是最好的选择。 虽然它们在离线环境中工作,但是也提供根据需要在远程系统间传递数据的机制。

此外,独立应用程序也可以使用包括电话功能和访问本地数据存储在内的特定设备的功能,例如 Pocket Outlook 和 Windows CE 数据库(CEDB)引擎。 当离线时,可以存储数据以备将来同步。 但是,如往常一样,独立应用程序面临着更多的分发和维护问题。 此外,创建独立应用程序还需要具有 C++ 开发技能,通常它的成本更高并增加了开发团队的难度。 然而至今还没有出现这种情况,预计智能电话将最终支持 Microsoft .NET Compact Framework 和智能设备扩展。 一旦出现这种情况,开发人员将可以使用 C# 和 Visual Basic® .NET 等语言来构建 Smartphone 应用程序。

数据检索

由于数据检索是所有商业应用程序的最基本的功能,因此设计中的一些挑战将集中于可用连接的类型。 您能依赖持续的连接或者连接可能中断吗? 您的系统只在某些时候或接入点才有连接吗?

Smartphone 为从远程数据源检索数据提供了多种选择。 一种是 ActiveSync,您可以使用它手动地在桌面计算机和 Smartphone 之间拖拽文档。 另一个选择是以编程方式从 PC 上访问该设备并使用远程 API(RAPI) 复制文件。 虽然这两种均能完成任务,但我认为它们都不是最好的选择。 Smartphone 内置的 Internet 连接要比这两种方法好得多。

在 Smartphone 设备上通过 Internet 检索远程数据非常简单。 实际上,如果您已经开发了一个检索整个 Internet 数据的 Pocket PC 应用程序,那么您可能已经理解所需了解的所有事情。 在 Smartphone 上与远程服务器通讯的最简单的方法是 WinInet 函数(HTTP或者FTP)、远程加载数据的 XMLDOM API 和 Microsoft Internet Explorer(参见图 2)。

fig02

图 2 在 Smartphone 中检索远程数据

XMLDOM 为 Web开发人员提供了几种熟悉的数据检索方法。利用 DOM,您可以通过两种主要方法来检索数据:文档对象的 Load 方法和 XMLHTTP 对象。两个对象都允许以 XML 格式从远程 Web 服务器中进行数据检索。两者之间最大的差别是,XMLHTTP 对象允许传递一个 XML 对象作为调用的一部分,而 Load 命令不允许。在必须传递数据才能进行检索的情况下,应该使用 XMLHTTP 对象。

无论在 XMLDOM 中使用何种方法, 只需要在代码中做少许调整即可。首先需要包括正确的头文件:

#include <objsafe.h>
namespace MSXML
{
#include <msxml.h>
}
#include <ocidl.h> 

objsafe.h 和 ocidl.h 文件都是必需的,因为它们包含了启用 COM 中智能指针所需的 GUID 描述。为了使 COM 调入 MSXML 分析器,需要创建 MSXML 命名空间并包括 msxml.h。此外,为了项目编译正确,需要将 ole32.lib 和 oleaut32.lib 库添加到链接器设置中。

一旦代码设置为使用 XMLDOM,就可以轻松地使用 DOMDocument 的 load 方法从远程服务器来检索数据了。该方法只需要一个能从中找到并检索 XML 文档的 URL。它在文档中不断重复,以填充窗体上的一个微调控件,如 图 3 所示。完成后,它会显示一个包含整个 XML 文档的消息框。

将数据存储在本地

在检索数据到达 Smartphone 后,下一步是探索在设备上将数据存储在本地的方法。一种选择是根本不将数据进行存储。您可以检索数据,执行一些操作,然后将数据从内存中释放。遗憾的是,在大多数情况下没有这么简单,因此必须确定应用程序的适用格式。数据可以保存到文件存储(例如闪卡)或者本地的数据存储(例如 CEDB)中。

对于大多数商业应用程序,需要将数据保存到文件系统中。尽管可以将数据写入 RAM 文件系统,但并不推荐这样使用,因为当设备关闭或掉电时所有数据都会丢失。对于永久性存储,Smartphone 设备提供了名为 IPSM 内存空间的闪存文件系统。虽然该空间在大多数 Smartphone 中都存在一定的限制,但是许多设备包含一个存储卡槽,允许使用可移动的内存卡。

由于有一些 API(如果您有在 Windows CE 平台上进行开发的经验,就可能对它们比较熟悉),因此,以编程方式确定在 Smartphone 中存储数据的位置非常简单。在 Windows Shell API 文档中可以找到这些调用。下面将重点讨论 SHGetSpecialFolderPath 函数。该函数允许访问主要的 Smartphone 文件系统并在运行时检索完整的路径。在检索路径后,就可以使用该路径存储与应用程序相关的数据。该函数需要一个 CSIDL_ 常数作为输入参数。这些常数表示 Smartphone OS 中的公共文件夹(应用程序数据、收藏夹、程序、开始等等)。由于这些公共区域在每个设备上的位置可能会有所不同,所以 CSIDL 常量提供了一个唯一的、独立于系统的方法来标识这些特殊文件夹。推荐自定义应用程序将数据存储到使用 CSIDL_APPDATA 常量返回目录的子目录中,如下所示:

#ifdef CSIDL_APPDATA
if(!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, TRUE))
    {
         ASSERT(FALSE);
         hr = HRESULT_FROM_WIN32(GetLastError());
    }
#else
    // Pocket PC doesn't have this defined so put our directory 
    // at the root. This will likely change 
    // in the future and this code should still work.
    _tcscpy(szFolderPath, TEXT("\\"));
#endif

如前所述,有时设备需要附加存储卡。与桌面计算机的硬盘驱动器不同,Smartphone 没有为存储卡分配驱动器号。相反,操作系统在根目录中建立目录来代表每块存储卡上的各个部分。要访问一个设备中的不同卡,可使用 FindFirstFlashCard 和 FindNextFlashCard 函数。如果找到存储卡,FindFirstFlashCard 就返回指向第一块存储卡的搜索句柄和指针。如果返回的句柄有效,则可以将它传递给 FindNextFlashCard,该函数将返回下一块存储卡的指针和一个表明搜索是否成功的 BOOL 值。

一旦找到所需的闪存卡,下一步就是查找存储数据的位置。在访问设备上的文档时,应始终使用 SHGetDocumentsFolder 函数。它既适用于新存储卡,也适用于原先使用的存储卡。下面是使用 SHGetDocumentsFolder 的一个例子。

TCHAR szDocPath[250];
if (!SHGetDocumentsFolder(L"\\",szDocPath))
    MessageBox(NULL,L"Retrieveing Path Failure",L"Call Failure",MB_OK); else
    MessageBox(NULL,szDocPath,L"Documents Folder Path",MB_OK);

有关模拟器的一个快速提示:Smartphone 模拟器不支持存储卡。它也不支持运行模拟器的 PC 上附加的真正存储卡。

数据库选择

对于几乎所有商业应用程序,都必须把数据保存到本地数据库中,对于许多 Smartphone 应用程序也是如此。与 Windows CE 和 Pocket PC 相比,Smartphone 上的数据库选择只有少许的差别。对于 Smartphone 的第一个版本 Smartphone 2002 而言,只有本地的 Windows CE 数据库受支持。遗憾的是,目前它不支持 SQL Server? CE 或者 Pocket Access。此外,访问 Windows CE 数据库的唯一选择是使用包含在 Windows CE 3.0 中的数据库API。不过也有好消息,即访问 Windows CE 数据库的代码与为其他基于 Windows CE 的设备所编写的代码几乎相同。

数据同步

在完成连接并处理数据后,下一步就是与远程数据存储同步。因为已经对使用 XMLDOM 在 Internet 上检索数据作了介绍,所以将继续使用该模型并通过 XMLHTTP 对象把更改发送回远程服务器。

在详细介绍使用 XMLHTTP 之前,先看一下 Smartphone 是怎样使用 Web 服务的。目前,在 Smartphone平台上没有可提供 SOAP 客户端功能的内置库或组件。但是,这并没有排除使用 Smartphone 的 SOAP 客户端的可能性,因为 Smartphone 2002 SDK 支持所有必须的构造块。如果 Smartphone上需要 SOAP 客户端,建议查看几个第三方库,也许不需费多大力气就可将其移植到 Smartphone 中。还应记住,一旦可以在 Smartphone 上使用 .NET Compact Framework,就可以使用其中的 SOAP 客户端功能了。

从 Smartphone 向远程数据存储同步数据的第一步是,从主内存中检索所有更改过的数据并将其转换为 XML 格式。完成后,实例化 XMLHTTP 对象并将数据传递到处理同步的指定URL。

如前所述,由于 XMLHTTP 对象可以使用 XML 格式将信息发送到远程服务器,因此将使用该对象。XMLHTTP 对象是前面项目中包含的 MSXML 库中提供的另一个对象。使用该对象的代码如 图 4 所示。对于使用从 IXMLHttpRequest 接口中创建的对象,用法非常简单。此外,创建一个 VARIANT 来保存用作基础的 IXMLDOMDocument 对象。为了传递这个复杂的类型,必须将 VARIANT 设置为 VT_DISPATCH 类型。最后的剩余步骤是调用 XMLHTTP 对象的 open 和 send 方法。

访问电话功能

通过 Windows CE API,开发人员能轻松地给应用程序添加电话功能。可以轻松地将诸如自动拨号、与呼叫日志交互、访问 SIM 卡、发送和接收 SMS 消息等功能添加到应用程序中。一个快速提示:要使应用程序工作正常,大多数电话 API 需要连接到模拟器的实际设备或 GSM 无线设备,因此,如果你计划开发这些类型的功能,请准备好测试真实的设备。

可以添加的最简单的电话功能之一是,在应用程序中建立语音呼叫。由于随 Smartphone 附带的辅助 TAPI,因此确切地说,只需要一行代码即可。您所有要做的只是在代码中包含 astdtapi.h 文件,在链接器设置中添加 cellcore.lib,并调用 tapiRequestMakeCall 函数,如下所示:

TCHAR szDefaultNum[] = TEXT("+1 (555) 555-5555");
LONG lResult;
lResult = tapiRequestMakeCall((LPTSTR) szDefaultNum, NULL, NULL, NULL);
return TRUE;

发送 SMS 消息也很简单。由于有了辅助 TAPI,因此只需要在代码中添加一个包含文件引用 (sms.h),在链接器设置中添加一个库引用 (sms.lib)。发送或者接收消息的第一步是调用 SmsOpen 函数。接下来,初始化源和目的地址。完成这两个步骤后,再调用 SmsSendMessage 函数。最后一步是调用 SmsClose 函数清除创建的 SMS_HANDLE。如 图 5 所示。

虽然还有更多可用的 API,但限于篇幅,本文只介绍了几个基本的。有了这些功能,就可以在移动应用程序中添加之前看起来不可能实现的各种功能,对应用程序进行更大地扩展。例如,当应用程序中发生特定事件时能够触发自动呼叫或消息。

小结

本文介绍了一些有关建立实际 Smartphone 应用程序的基本知识。如您所见,这些类型的 Smartphone 应用程序在企业计算领域非常引人注目。在不久的将来,随着具备熟悉且易用开发平台的廉价设备不可避免地与先前具有的移动电话用户基础相结合,您应当能看到 Smartphone 应用程序的新一轮热潮。

相关文章,请参阅:
Developing Applications for the Microsoft Smartphone
Smartphone 2002 SDK
有关背景信息,请参阅:
Wireless Web: Microsoft Mobile Internet Toolkit Lets Your Web Application Target Any Device Anywhere
http://www.microsoft.com/mobile

Chris Dellinger是一名资深架构师,任职于美国北卡罗莱纳州罗列市的 Vytek Solutions 公司。联系方式:dellinger_chris@hotmail.com.

转到原英文页面


返回页首返回页首