建立牢固的多功能Smartphone應用程序.doc_第1頁
建立牢固的多功能Smartphone應用程序.doc_第2頁
建立牢固的多功能Smartphone應用程序.doc_第3頁
建立牢固的多功能Smartphone應用程序.doc_第4頁
建立牢固的多功能Smartphone應用程序.doc_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

你也許聽說過Pocket PC Phone Edition,它是另一個裝備微軟軟件的電話。為了避免混亂,我將澄清Pocket PC Phone Edition與Smartphone之間的區(qū)別。圖1顯示了兩者的區(qū)別(如果你有興趣查閱建立Smartphone圖形界面的信息,可以查看開發(fā)高效的Smartphone用戶界面)。Pocket PC Phone Edition是一款功能全面的內建移動電話能力的Pocket PC設備。在尺寸上它與其它的Pocket PC設備相近,體積比Smartphone要大一些。Pocket PC Phone Edition要求更大的功率和更多的內存;此外,它有一個觸摸屛,面積比通常的Smartphone屏幕(它不支持觸摸屛)要大得多。用戶與設備的交互途徑也不同:Pocket PC Phone Edition使用輸入筆與觸摸屛交互,而Smartphone使用電話的小鍵盤。 哪一類型的設備適合你的需要取決于三個主要因素:成本、功能和使用的簡便性。微軟估計Smartphone的定價與其它的高端移動電話相近,比Pocket PC Phone Edition設備低。你需要的功能依賴于應用程序設計成做什么的。對于多數(shù)移動應用程序,Smartphone和Pocket PC Phone Edition執(zhí)行的情況相同。但是,如果應用程序需要大量的磁盤空間和內存、附加的硬件或者大屏幕,Pocket PC Phone Edition也許是正確的選擇。 無論哪種設備和在它上面運行的應用程序,都必須易于使用,要考慮數(shù)據(jù)輸入的問題。首先,你必須決定使用輸入筆還是小鍵盤,這實際上沒有關系。通過菜單選項的數(shù)據(jù)輸入易于被其它設備處理。但是,如果輸入文本信息,Pocket PC Phone Edition明顯好用一些。幸運的是兩種設備都支持Windows CE API,使你能輕易地為它們建立一個基礎代碼。 建立Smartphone應用程序 真實的Smartphone應用程序需要傳遞什么?在多數(shù)移動應用程序中很多事務是共同的。它們從一個遠程數(shù)據(jù)存儲中檢索數(shù)據(jù)、處理、保存、在本地離線處理數(shù)據(jù)、上載更改并與電話特性交互。如果你在需要時能夠了解并建立這些元素,就能夠從事真正的Smartphone開發(fā)了。 下一步是決定將建立的應用程序的類型:基于瀏覽器的(browser-based)還是獨立的(standalone)。 Smartphone上的基于瀏覽器的方案包含能被袖珍互聯(lián)網瀏覽器(Pocket Internet Explorer)訪問的Web內容。這種類型的應用程序是已存在的內容提供商的最好選擇,他們希望將出售物擴展到Smartphone所有者。Smartphone上的基于瀏覽器的應用程序與其它平臺上的好處相同:簡單的軟件分發(fā)和維護,因為所有的代碼在Web服務器上。當然,缺點是并不能保證始終連接到互聯(lián)網。另一個問題是袖珍互聯(lián)網瀏覽器應用程序不能與設備的內建特性交互。盡管如此,這類應用程序可以使用已經存在的(例如ASP.NET移動控件)Web開發(fā)和優(yōu)化工具開發(fā)。 與Web應用程序不同,你能使用類似嵌入式(eMbedded)Visual C+的工具來開發(fā)一個定制的應用程序。幸運的是Smartphone 與Pocket PC平臺相似。因為大多數(shù)API相同,使用嵌入式Visual C+為Pocket PC平臺開發(fā)的應用程序能簡單地移植到Smartphone上,其結果是在很大程度上節(jié)省了為兩個設備開發(fā)的成本。我移植了兩個應用程序,一個只需要簡單地重新編譯,另一個只花了結果幾個小時來解決平臺之間的微弱不同。 開發(fā)獨立的應用程序時你有更大的靈活性,這類應用程序往往更加牢固,并能用于連接和不連接的模式。對多數(shù)商業(yè)應用,獨立的應用程序也許是最好的選擇。它們在離線環(huán)境下使用,也提供了根據(jù)需要在遠程系統(tǒng)間傳遞數(shù)據(jù)的機制。 此外,獨立應用程序也可以使用特定設備的特性,包括技術特性和訪問本地數(shù)據(jù)存儲,例如Pocket Outlook和Windows CE數(shù)據(jù)庫(CEDB)引擎。當離線時,為了將來同步,數(shù)據(jù)可以被存儲起來。但是,獨立應用程序面臨著更多的分發(fā)和維護問題。此外建立獨立應用程序還需要C+經驗,通常它的成本更高并難以找到開發(fā)者。但是這種情況不會發(fā)生了,預計微軟.NET Compact Framework和Smart Device Extensions最后將支持Smartphone。如果這實現(xiàn)了,開發(fā)者可以使用C#和Visual Basic .NET等語言建立Smartphone應用程序。 數(shù)據(jù)檢索 因為任何商業(yè)應用程序最基本的特性是檢索數(shù)據(jù),設計的部分問題圍繞可用連接的類型。你能依賴持續(xù)的連接或者連接可能中斷嗎?你的系統(tǒng)只有一定的次數(shù)和訪問點才需要連接嗎? Smartphone為從遠程數(shù)據(jù)源檢索數(shù)據(jù)提供了幾種選擇。一種是ActiveSync,你可以使用它手動地在桌面計算機和Smartphone之間推/拉(push/pull)文檔。另一個選擇是編程從PC上訪問該設備并使用遠程API(RAPI)復制文件。雖然這些方法完成了任務,但是不是最好的選擇。Smartphone的內建互聯(lián)網連接更好。 在Smartphone設備上通過互聯(lián)網檢索遠程數(shù)據(jù)非常簡單。實際上,如果你已經開發(fā)了一個通過互聯(lián)網檢索數(shù)據(jù)的Pocket PC應用程序,就已經知道所有需要的了。在Smartphone上與遠程服務器通訊的最簡單的方法是WinInet功能(HTTP或者FTP)、在遠程載入數(shù)據(jù)的XMLDOM API和微軟互聯(lián)網瀏覽器 XMLDOM 給Web開發(fā)人員提供了幾種數(shù)據(jù)檢索的方法。使用DOM你能通過兩個主要的方法檢索數(shù)據(jù):文檔對象和XMLHTTP對象的Load方法。兩個對象都允許從遠程Web服務器上的XML格式中檢索數(shù)據(jù)。兩者之間最大的區(qū)別是XMLHTTP對象允許你傳遞一個XML對象作為調用的一部分,盡管Load命令沒有允許。在為了檢索數(shù)據(jù)而需要傳遞數(shù)據(jù)的情況下,你應該使用XMLHTTP對象。 不管你在XMLDOM中使用那種方法,只需要在代碼中作一點點更改。首先你必須包括正確的頭文件: #include namespace MSXML#include #include objsafe.h和ocidl.h都是必須的,因為它們包含GUID描述,而GUID是與COM一起工作的指針必須的。為了使COM調用進入MSXML分析程序,你必須建立MSXML名字空間并包含msxml.h。此外,為了項目編譯正確,你應該把ole32.lib和oleaut32.lib庫添加到連接程序設置中。 一旦代碼使用XMLDOM,你能簡單地使用DOMDocument 的load方法從遠程服務器檢索數(shù)據(jù)。該方法只需要一個能找到并檢索數(shù)據(jù)的URL。它在文檔中重復構建窗體上的一個微調控件(spinner control)。完成后它顯示一個包含整個XML文檔的消息框。 MSXML:IXMLDOMDocument *iXMLDoc = NULL;MSXML:IXMLDOMParseError *pParsingErr = NULL;MSXML:IXMLDOMElement *iXMLElm = NULL;MSXML:IXMLDOMNodeList *iXMLChild = NULL;MSXML:IXMLDOMNode *iXMLItem = NULL;short tEmpty;BSTR bStr;VARIANT vXMLSrc;HRESULT hr;HWND hListBox;long lLength;hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);if(!SUCCEEDED(hr) return 0;hr = CoCreateInstance (MSXML:CLSID_DOMDocument, NULL,CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, MSXML:IID_IXMLDOMDocument, (LPVOID *)&iXMLDoc);if(iXMLDoc) iXMLDoc-put_async(VARIANT_FALSE); /Smartphone 2002 工作區(qū): /刪除文檔安全選項 IObjectSafety *pSafety; DWORD dwSupported, dwEnabled; if ( SUCCEEDED(iXMLDoc-QueryInterface( IID_IObjectSafety, (void*)&pSafety) pSafety-GetInterfaceSafetyOptions( MSXML:IID_IXMLDOMDocument, &dwSupported, &dwEnabled ); pSafety-SetInterfaceSafetyOptions( MSXML:IID_IXMLDOMDocument, dwSupported, 0 ); VariantInit( &vXMLSrc ); vXMLSrc.vt = VT_BSTR; iXMLDoc-put_async(VARIANT_FALSE); vXMLSrc.bstrVal = SysAllocString(Lhttp:/localhost/ smartphonearticledata.xml); hr = iXMLDoc-load(vXMLSrc, &tEmpty); SysFreeString(vXMLSrc.bstrVal); iXMLDoc-get_documentElement(&iXMLElm); iXMLElm-selectNodes(L/DATA/STATUS/S,&iXMLChild); /iXMLElm-get_childNodes(&iXMLChild); iXMLChild-get_length(&lLength); hListBox = GetDlgItem( hWnd, IDC_LISTISSUES); for (int x=0;xget_item(x,&iXMLItem); iXMLItem-get_text(&bStr); SendMessage (hListBox, LB_ADDSTRING, 0, (LPARAM) bStr); /iXMLChild-get_item(1,&iXMLItem); iXMLDoc-get_xml(&bStr); MessageBox(NULL,bStr,TEXT(Article Demo),MB_OK);本地存儲數(shù)據(jù) 在檢索數(shù)據(jù)到Smartphone后,下一步是研究在設備上本地存儲數(shù)據(jù)的方法。一種選擇是根本不保存。你可以檢索數(shù)據(jù),執(zhí)行一些操作,接著從內存中釋放數(shù)據(jù)。不幸的是在大多數(shù)情況下沒有這么簡單,因此你不得不決定適合應用程序的格式。你也許會保存數(shù)據(jù)到文件存儲(例如閃存卡),或者保存在本地的數(shù)據(jù)存儲(例如CEDB)中。 對于多數(shù)商業(yè)應用程序,你需要把數(shù)據(jù)保存在文件系統(tǒng)中。盡管能夠將數(shù)據(jù)寫入RAM文件系統(tǒng),但是并不推薦這樣使用,因為當設備關閉或掉電時所有數(shù)據(jù)都會丟失。對于持續(xù)的存儲器,Smartphone設備提供作為IPSM內存控件的閃存文件系統(tǒng)。在多數(shù)Smartphone上空間受到限制,但是許多設備包含一個存儲卡槽,允許使用可移走的存儲卡。 編程決定Smartphone上在哪兒存儲數(shù)據(jù)很簡單,這得感謝你在Windows CE 平臺上進行開發(fā)所熟悉的一些API。這些調用可以在Windows Shell API文檔中找到?,F(xiàn)在我將聚焦于SHGetSpecialFolderPath函數(shù)。該函數(shù)允許你訪問主要的Smartphone文件系統(tǒng)并在運行時檢索完整的路徑。在檢索路徑后,你能使用該路徑存儲與應用程序相關的數(shù)據(jù)。該函數(shù)需要一個CSIDL_常數(shù)作為輸入參數(shù)。這些常數(shù)反映了Smartphone操作系統(tǒng)中的共有文件夾(應用程序數(shù)據(jù)、收藏夾、程序、開始等等)。因為這些公共區(qū)域也許在不同設備上,CSIDL常量提供了一個唯一的系統(tǒng)標識來識別這些目錄。推薦客戶應用程序在CSIDL_APPDATA常量返回目錄的子目錄中保存數(shù)據(jù)。例如: #ifdef CSIDL_APPDATAif(!SHGetSpecialFolderPath(NULL, szFolderPath, CSIDL_APPDATA, TRUE) ASSERT(FALSE); hr = HRESULT_FROM_WIN32(GetLastError(); #else / Pocket PC沒有這種定義來在根中讀取目錄。/也許未來會作些改變,但代碼仍然可以工作 _tcscpy(szFolderPath, TEXT();#endif我先前講到,有些設備需要附加存儲卡。與你的桌面計算機的硬盤驅動器不同,Smartphone沒有為存儲卡分配驅動器符號。作為代替,操作系統(tǒng)在根目錄中建立目錄來表現(xiàn)每塊存儲卡上的不同部分。為了訪問一個設備中的不同卡,使用FindFirstFlashCard和FindNextFlashCard函數(shù)。如果找到了存儲卡,F(xiàn)indFirstFlashCard返回一個指向第一塊存儲卡的句柄和指針。如果句柄是正確的,你可以把它傳遞給FindNextFlashCard,該函數(shù)將返回下一塊存儲卡的指針和一個BOOL值來表明搜索是否成功。 一旦你找到了希望使用的存儲卡,下一步就是查找一個位置來存儲數(shù)據(jù)。在訪問設備上的文檔時通常使用SHGetDocumentsFolder函數(shù)。它可用于新的或者原來的存儲卡。下面是使用SHGetDocumentsFolder的一個例子: TCHAR szDocPath250;if (!SHGetDocumentsFolder(L,szDocPath) MessageBox(NULL,LRetrieveing Path Failure,LCall Failure,MB_OK); else MessageBox(NULL,szDocPath,LDocuments Folder Path,MB_OK); 模擬器筆記:Smartphone模擬器不支持存儲卡。它也不支持附加在運行模擬器的PC上的真正的存儲卡。 數(shù)據(jù)庫操作 對于幾乎所有商業(yè)應用程序來說,把數(shù)據(jù)保存到本地數(shù)據(jù)庫是必要的,對于許多Smartphone應用程序也是這樣。與Windows CE和Pocket PC相比, Smartphone上數(shù)據(jù)庫的選擇只有少許的不同。對于第一個Smartphone版本Smartphone 2002,只支持本地Windows CE數(shù)據(jù)庫,目前它不支持SQL Server CE或者Pocket Access。此外訪問Windows CE數(shù)據(jù)庫的唯一選擇是使用包含在Windows CE 3.0中的數(shù)據(jù)庫API。不過訪問Windows CE數(shù)據(jù)庫的代碼與為Windows CE設備所寫的代碼幾乎相同。 同步數(shù)據(jù) 在使用完連接并處理數(shù)據(jù)后,下一步就是與遠程數(shù)據(jù)存儲同步。因為我已經介紹過使用XMLDOM通過互聯(lián)網檢索數(shù)據(jù),我將繼續(xù)使用該模型并將改變通過XMLHTTP對象發(fā)送回遠程服務器。 在介紹使用XMLHTTP的細節(jié)前,我們看看Smartphone怎樣使用Web服務。目前,在Smartphone平臺上沒有內建庫或組件提供SOAP客戶端功能。但是Smartphone 的SOAP客戶端并不在可能的范圍之外,因為Smartphone 2002 SDK支持所有可能需要的組件。如果Smartphone上需要SOAP客戶端,我建議查看第三方庫,它也許能移植到Smartphone而沒有太多問題。此外你應該記得一旦Smartphone上的.NET簡潔框架組件可以使用,就能使用Smartphone客戶端的功能了。 從Smartphone向遠程數(shù)據(jù)存儲同步數(shù)據(jù)的第一步是從主存儲器中檢索所有改變了的數(shù)據(jù)并轉換為XML格式。完成后,實例化XMLHTTP對象并把數(shù)據(jù)傳遞到處理同步的特定URL。 先前講到,因為XMLHTTP對象擁有使用XML格式發(fā)送信息到遠程服務器的能力,在這兒它將被使用到。XMLHTTP對象是前面的項目中包含的MSXML庫中可用的另一個對象。圖4是該對象的使用。它很容易使用,從IXMLHttpRequest接口中建立了一個對象。此外,建立一個VARIANT來保持IXMLDOMDocument對象。為了傳遞這個復雜的類型,VARIANT必須通過VT_DISPATCH類型設置。剩下的步驟是調用XMLHTTP 對象的open和send方法。 MSXML:IXMLDOMDocument *iXMLDoc = NULL;MSXML:IXMLHttpRequest *iXMLHttp = NULL;HRESULT hr;BSTR bStr = NULL;VARIANT vUserID;VARIANT vPassword;VARIANT vPassValue;VARIANT vAsync;short tEmpty;hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);if(!SUCCEEDED(hr) return 0;hr = CoCreateInstance (MSXML:CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, MSXML:IID_IXMLDOMDocument, (LPVOID *)&iXMLDoc);if(iXMLDoc) iXMLDoc-put_async(VARIANT_FALSE); / Smartphone 2002工作區(qū): /刪除文檔安全選項 IObjectSafety *pSafety; DWORD dwSupported, dwEnabled; if ( SUCCEEDED(iXMLDoc-QueryInterface(IID_IObjectSafety, (void*)&pSafety) pSafety-GetInterfaceSafetyOptions( MSXML:IID_IXMLDOMDocument, &dwSupported, &dwEnabled ); pSafety-SetInterfaceSafetyOptions( MSXML:IID_IXMLDOMDocument, dwSupported, 0 ); iXMLDoc-put_async(VARIANT_FALSE); iXMLDoc-loadXML(LJoe Smith, &tEmpty);VariantInit(&vAsync);vAsync.vt = VT_BOOL;vAsync.boolVal = false;VariantInit(&vUserID);vUserID.vt = VT_BSTR;vUserID.bstrVal = L;VariantInit(&vPassword);vPassword.vt = VT_BSTR;vPassword.bstrVal = L;VariantInit(&vPassValue);vPassValue.vt = VT_DISPATCH;vPassValue.pdispVal = iXMLDoc;hr = CoInitializeEx(NULL,COINIT_MULTITHREADED); if(!SUCCEEDED(hr) return 0;hr = CoCreateInstance (MSXML:CLSID_XMLHTTPRequest, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, MSXML:IID_IXMLHttpRequest, (LPVOID *)&iXMLHttp);iXMLHttp-open(LGET, Lhttp:/localhost/smartphonesavetest.asp, vAsync,vUserID,vPassword);hr=iXMLHttp-send(vPassValue);iXMLHttp-get_responseText(&bStr);訪問電話特性 通過Windows CE API,開發(fā)人員能簡單地給應用程序添加電話功能。類似自動撥號、與調用日志交互、訪問SIM卡的能力、發(fā)送和接收SMS消息等等特性可以簡單地添加到應用程序。為了工作正常,大多數(shù)技術API需要真實的設備或者GSM無線設備連接到模擬器,因此如果你計劃開發(fā)這些類型的特性,準備好測試真實的設備。 電話特性的一個最簡單的例子是在應用程序中建立語音通話。因為我們有隨著Smartphone一起發(fā)布的輔助TAPI,只需要一行代碼。所有需要作的是在代碼中包含astdtapi.h文件,在連接程序設置中添加cellcore.lib,并調用tapiRequestMakeCall函數(shù): TCHAR szDefaultNum = TEXT(+1 (555) 555-5555);LONG lResult;lResult = tapiRequestMakeCall(LPTSTR) szDefaultNum, NULL, NULL, NULL);return TRUE; 發(fā)送SMS消息也很簡單。有了輔助TAPI,你只需要在代碼中添加一個文件引用(sms.h),在連接程序設置中添加一個庫(sms.lib)。發(fā)送或者接收消息的第一步是調用SmsOpen函數(shù),下一步初始化源和目的地址,完成后調用SmsSendMessage函數(shù)。最后一步是調用SmsClose函數(shù)清除建立的SMS_HANDLE。代碼見圖5。 SMS_HANDLE smshHandle;SMS_ADDRESS smsaSource;SMS_ADDRESS smsaDestination;TEXT_PROVIDER_SPECIFIC_DATA tpsd;SMS_MESSAGE_ID smsmidMessageID;/嘗試打開一個SMS句柄if(FAILED(SmsOpen(SMS_MSGTYPE_TEXT, SMS_MODE_SEND, &smshHandle, NULL) MessageBox(NULL,LCall to SmsOpen failed.,LError,MB_OK | MB_ICONERROR); return;/建立源地址if(!bUseDefaultSMSC) smsaSource.smsatAddressType = SMS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論