Windows Mobile Widget 開發

1,746 views
1,592 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,746
On SlideShare
0
From Embeds
0
Number of Embeds
16
Actions
Shares
0
Downloads
19
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Windows Mobile Widget 開發

  1. 1. Windows Mobile 6.5 Widget<br />王寧疆<br />資深講師<br />資策會數位教育研究所<br />MCPD/MCT/MVP<br />
  2. 2. 大綱<br />認識Windows Mobile Widget<br />設計Widget的基本步驟<br />Widget與Web服務<br />閱讀即時新聞<br />自己動手做翻譯機<br />Widget與資料庫存取<br />與環境互動<br />Widget與安全性<br />透過網站部署Widget<br />Widget開發最佳做法<br />
  3. 3. 行動裝置程式開發新選擇<br />開發智慧型裝置應用程式<br /><ul><li>使用VB.NET, C#, C++語言開發</li></li></ul><li>行動裝置程式開發新選擇(續)<br />開發行動裝置網頁<br /><ul><li>使用VB.NET, C#語言開發
  4. 4. 視需要安裝Mobile Web Forms網頁範本(http://blogs.msdn.com/webdevtools/archive/2007/09/17/tip-trick-asp-net-mobile-development-with-visual-studio-2008.aspx)</li></ul>開發Windows Mobile Widget<br /><ul><li>使用HTML, Javascript, DHTML,CSS,XmlHttpRequest,AJAX等網頁開發技術開發</li></li></ul><li>認識Windows Mobile Widget<br />一種利用HTML, Javascript, DHTML,CSS,XmlHttpRequest,AJAX等網頁開發技術製作, 可以在Windows Mobile 6.5平台執行的程式<br />可以透過XML Web Service或WCF的幫助, 取得並呈現遠端伺服器的資料<br />提供商業資料, 氣象預報, 即時股價, 即時新聞, 交通路況, 翻譯服務等資訊供行動裝置的使用者檢視<br />其功能等同於Windows Vista的Gadget<br />
  5. 5. Windows Mobile Widget的特性<br />與一般應用程式具有相同的外觀與操作體驗<br />受限於sandbox安全管制機制, 但是仍然可以使用裝置的部分功能<br />支援AJAX, JSON剖析器, 具備執行ActiveX控制項(例如Flash)的能力<br />能夠在所有的Windows Mobile 6.5裝置上正常執行<br />
  6. 6. 運作中的Mobile Widget<br />Internet<br />Cloud<br />Computing<br />
  7. 7. Windows Mobile Widget範例<br />
  8. 8. Widget與網頁的差異<br />Widget是安裝在Windows Mobile的網頁<br />Widget的優點<br />Widget消耗的頻寬較傳統的網頁少, 因為網頁的基本內容(HTML,CSS,Javascript)已安裝在Windows Mobile中, 不需要從Web伺服器傳送到行動裝置<br />Widget更新顯示內容的速度較傳統的網頁快, 可以有效節省連線網路的花費<br />Widget支援功能表與螢幕鍵盤的整合, 與資料快取, 提升取用資料的速度<br />Widget的缺點<br />Widget必須部署到行動裝置, 網頁只要部署到Web伺服器<br />
  9. 9. Widgetvs網頁<br />瀏覽網頁功能<br />網頁功能<br />最佳化<br />Mobile Browser<br />Mobile Widget<br />
  10. 10. 設計Widget三部曲<br />1<br />2<br />3<br />設計<br />包裝<br />部署<br />設計並開發Widget功能<br />將.wgt檔案部署到Windows Mobile執行<br />上傳至 Windows Marketplace <br />將相關檔案包裝成.wgt檔案<br />
  11. 11. 設計Widget的基本步驟<br />認識設計Widget的技術名詞<br />製作Widget內容<br />製作config.xml<br />包裝成*.wgt檔案(壓縮檔)<br />部署到Windows Mobile 6.5行動裝置<br />安裝與執行<br />製作包裝*.wgt的工具<br />
  12. 12. 認識設計Widget的技術名詞<br />HTML:定義Widget內容的語法<br />Javascript:類似C語言語法, 負責控制Widget的內容或效果<br />DHTML:利用Javascript控制Widget顯示的內容和效果<br />CSS:Cascading Style Sheet的縮寫, 負責設定Widget樣式的語法<br />XmlHttpRequest:利用非同步技術和遠端伺服溝通的技巧<br />AJAX:asynchronous JavaScript and XML的縮寫, 利用XmlHttpRequest技術更新Widget內容的技術<br />
  13. 13. 製作Widget內容<br />內容與格式類似HTML網頁文件<br />Widget.htm<br />&lt;html&gt;<br /> &lt;head&gt;<br /> &lt;title&gt;Widget標題&lt;/title&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br />Widget內容<br />&lt;/body&gt;<br />&lt;/html&gt;<br />
  14. 14. &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;widget version=&quot;1.0&quot; <br />xmlns=&quot;http://www.w3.org/ns/widgets&quot; <br /> id=&quot;Url格式的id&quot;&gt;<br /> &lt;name&gt;Widget名稱&lt;/name&gt;<br /> &lt;content src=&quot;Widget.htm&quot; type=&quot;text/html&quot; /&gt;<br /> &lt;access network=&quot;true&quot; /&gt;<br /> &lt;icon src=&quot;Widget.png&quot; /&gt;<br /> &lt;description&gt;Widget說明&lt;/description&gt;<br />&lt;/widget&gt;<br />製作config.xml<br />Widget圖示可以是.PNG, .JPG, .GIF圖檔, 必須和config.xml, Widget內容檔(*.htm)放在同一個資料夾<br />Widget圖示<br />
  15. 15. 包裝成*.wgt檔案(壓縮檔)<br />將Widget圖示檔,config.xml, Widget內容檔(*.htm)壓縮成*.zip的壓縮檔<br />可以將上述三個檔案選取之後, 利用[檔案總管]的[傳送至 | 壓縮的(zipped)資料夾]功能進行壓縮<br />如果Widget需要用到*.css, *.js. 或是其他的圖檔, 也要一起封裝到壓縮檔中<br />將*.zip的壓縮檔的副檔名更改成*.wgt<br />
  16. 16. 部署到Windows Mobile 6.5行動裝置<br />做法<br />將*.wgt檔案放到裝置模擬器的共用資料夾<br />利用AcitveSync或Windows Mobile Device Center(for Windows Vista)將*.wgt檔案複製到Windows Mobile 6.5裝置<br />將*.wgt壓縮檔複製到Web伺服器, 開啟Windows Mobile 6.5裝置的Internet Explorer瀏覽器, 連線到Web伺服器進行下載<br />
  17. 17. 設定裝置模擬器的共用資料夾<br />執行裝置模擬器的[檔案 | 設定]功能<br />共用資料夾<br />選擇<br />
  18. 18. 設定裝置網路連線功能<br />利用[裝置模擬器管理員]工具<br />執行[連接]功能<br />執行[連接底座]功能<br />
  19. 19. 安裝與執行<br />點選*.wgt檔案進行安裝, 安裝成功後會自動執行<br />點選<br />
  20. 20. 製作包裝*.wgt的工具<br />利用XmlTextWriter類別建立config.xml<br />建立副檔名為*.wgt的壓縮檔<br />簡化開發Widget的工作<br />
  21. 21. Widget與Web服務<br />利用遠端伺服器提供的服務提供Widget顯示的內容<br />XML Web Service<br />WCF服務<br />Bing API<br />Image, Ad, Video, Spell, News, PhoneBook, Translation, InstantAnswer, RelatedSearch, …<br />Google API<br />…<br />
  22. 22. 示範:閱讀即時新聞<br />使用Bing API提供的即時新聞查詢功能<br />
  23. 23. 示範:自己動手做翻譯機<br />使用Bing API提供的翻譯功能<br />
  24. 24. Widget與資料庫存取<br />透過Web服務存取資料庫中的記錄<br />必須使用IP連線到Web服務<br />
  25. 25. Widget設計細節<br />使用DHTML, DOM(Document Object Model), 與CSS<br />DOM的物件階層<br />使用XmlHttp協定<br />處理呼叫結果<br />讀取XML文件的內容<br />
  26. 26. 使用DHTML, DOM, CSS<br />&lt;html&gt; <br /> &lt;head&gt;<br />&lt;script type=&quot;text/javascript&quot;&gt;<br /> function Demo()<br />{<br />document.getElementById(&quot;header&quot;).style.color=&quot;red&quot;;<br /> }<br /> &lt;/script&gt;<br /> &lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;h1 id=&quot;header&quot;&gt;My header&lt;/h1&gt;<br /> &lt;/body&gt;<br />&lt;/html&gt; <br />My header<br />
  27. 27. DOM的物件階層<br />&lt;html&gt;<br /> &lt;/head&gt;&lt;script type=&quot;text/javascript&quot;&gt;<br /> function Demo()<br /> {<br />document.all.lblOrderDropdown.innerText = &quot;...&quot;;<br />document.forms[0].drpOrders.style.visibility = &quot;hidden&quot;;<br /> }<br /> &lt;/script&gt;&lt;/head&gt;<br /> &lt;body&gt;<br /> &lt;form&gt;<br /> &lt;span id=&quot;lblOrderDropdown&quot;&gt;Select Order:&lt;/span&gt;<br /> &lt;select id=&quot;drpOrders&quot;&gt;<br /> &lt;/form&gt;<br /> &lt;/body&gt;<br />&lt;/html&gt;<br />
  28. 28. 使用XmlHttp協定<br />&lt;script type=&quot;text/javascript&quot;&gt;<br />varxmlhttp;<br />varloadXMLDoc(url)<br />{<br /> if (window.ActiveXObject)<br /> {<br />xmlhttp=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br /> if (xmlhttp)<br /> {<br />xmlhttp.onreadystatechange=xmlhttpChange;<br />xmlhttp.open(&quot;GET&quot;,&quot;Web服務的網址&quot;,true);<br />xmlhttp.send(&quot;資料&quot;);<br /> }<br /> }<br />}<br />&lt;/script&gt;<br />見下頁<br />
  29. 29. 處理呼叫結果<br />0=&gt;Uninitialized<br />1=&gt;Loading<br />2=&gt;Loaded<br />3=&gt;Interactive<br />4=&gt;Complete<br />&lt;script type=&quot;text/javascript&quot;&gt;<br />function xmlhttpChange()<br />{<br /> if (xmlhttp.readyState==4) {<br /> if (xmlhttp.status==200) {// 如果沒有發生錯誤<br />// ...處理結果...<br /> }<br />else {<br /> alert(&quot;Problem retrieving XML data&quot;);<br /> }<br /> }<br />}<br />&lt;/script&gt;<br />見下頁<br />
  30. 30. 讀取XML文件的內容<br />&lt;Customers diffgr:id=&quot;Customers1&quot; msdata:rowOrder=&quot;0&quot;&gt;<br /> &lt;CustomerID&gt;ALFKI&lt;/CustomerID&gt;<br /> &lt;CompanyName&gt;AlfredsFutterkiste&lt;/CompanyName&gt;<br />...<br />&lt;/Customers&gt;<br />&lt;Customers diffgr:id=&quot;Customers2&quot; msdata:rowOrder=&quot;1&quot;&gt;<br /> ...<br />&lt;/Customers&gt;<br />結果<br />varobjXmlDoc;<br />objXmlDoc = new ActiveXObject(&quot;Msxml2.DOMDocument&quot;);<br />objXmlDoc.loadXML(xmlhttp.responseText);<br />objNodeList = objXmlDoc.getElementsByTagName(&quot;Customers&quot;);<br />dataNodeList = objNodeList[0].childNodes;<br />valueNode = dataNodeList.item(0); <br />客戶編號=valueNode.text;<br />處理方法<br />
  31. 31. 與環境互動<br />使用Widget API<br />使用功能表<br />Widget相關的事件<br />長效型記憶體支援<br />偵測螢幕的方向<br />偵測電源的狀態<br />
  32. 32. 使用Widget API<br />利用widget物件提供的功能<br />存取Widget相關的資訊<br />widget.name,widget.identifier,widget.description, widget.locale,widget.currentIcon,widget.authorName,widget.authorEmail, widget.authorURL, widget.version, widget.width, widget.height<br />取用相關的物件, 例如功能表<br />取用長效型記憶體<br />利用SystemState物件提供的功能<br />查詢裝置的狀態資訊<br />在狀態改變時收到通知<br />
  33. 33. 使用功能表<br />直接利用Windows Mobile提供的功能表功能, 不需要使用HTML, CSS等技術製作功能表<br />支援建立階層式的功能表<br />可以在widget執行的時候動態啟用/禁用功能表<br />利用widget.menu物件提供的功能建立功能表:<br />append,clear,createMenuItem,getMenuItemById,remove,setSoftKey<br />
  34. 34. 建立功能表的做法<br />利用widget.menu.createMenuItem函數建立功能表<br />必須傳入功能表的ID當做參數<br />設定功能表的屬性:<br />text:功能表顯示的文字<br />onSelect:功能表被點選時欲執行的動作<br />enabled:控制功能表啟用/禁用的屬性<br />呼叫widget.menu.setSoftKey函數指定功能表顯示的位置<br />widget.menu.leftSoftKeyIndex:顯示在左下角<br />widget.menu.rightSoftKeyIndex:顯示在右下角<br />
  35. 35. 建立功能表範例<br />function createMenu() {<br />varRefreshMenu = <br />widget.menu.createMenuItem( 0 );<br />RefreshMenu.text =&quot;Refresh&quot;;<br />RefreshMenu.onSelect = lskHandler;<br />widget.menu.setSoftKey(RefreshMenu , <br />widget.menu.leftSoftKeyIndex );<br />}<br />function lskHandler() {<br />// left soft key<br /> // handler code here<br />}<br />
  36. 36. Widget相關的事件<br />Widget顯示狀態改變時會引發事件:<br />onhide事件<br />當Widget被其他執行中的程式蓋住時引發的事件<br />收到onhide事件時, widget可以暫停目前的工作<br />onshow事件<br />當Widget顯示在使用者面前時引發的事件<br />收到onshow事件時, widget可以恢復被暫停的工作, 並更新Widget顯示的資料<br />
  37. 37. 處理Widget狀態改變的事件<br />widget.onshow = function() <br />{<br />// 恢復執行工作<br /> // 注意:不要呼叫alert函數顯示訊息<br />};<br />widget.onhide = function() <br />{<br />// 暫停工作<br />};<br />
  38. 38. 長效型記憶體支援<br />目的<br />儲存非暫時性的資料<br />特性<br />資料存放在Widget獨立的儲存區中,不同的Widget不能夠存取<br />容量上限 4000位元組(以鍵值為單位)<br />資料會以未加密的方式儲存在裝置中<br />適用場合<br />儲存Widget下一次執行時欲使用的資料<br />儲存Widget升級後欲使用的資料<br />
  39. 39. 使用長效記憶體<br />使用方法<br />範例<br />// 儲存資料<br />widget.setPreferenceForKey(&quot;資料&quot;, &quot;識別鍵值&quot; );<br />// 讀取資料<br />var data = widget.preferenceForKey(&quot;識別鍵值&quot;);<br />
  40. 40. 偵測行動裝置的狀態<br />利用SystemObject物件提供的功能<br />CradlePresent:裝置是否連接到底座<br />PhoneHomeService:於電信網路註冊的狀態<br />PhoneRoaming:手機漫遊的狀態<br />PhoneSignalStrength:手機信號強度(百分比)<br />PhoneOperatorName:電信業者的名稱<br />DisplayRotation:裝置螢幕旋轉的角度<br />PowerBatteryStrength:電池剩餘電量(百分比) <br />PowerBatteryState:電池狀態<br />低電量, 充電中, …<br />
  41. 41. 偵測螢幕的方向<br />偵測螢幕是否旋轉的範例<br />varSystemState = widget.createObject(&quot;SystemState&quot;);<br />SystemState.DisplayRotation.addEventListener(<br /> &quot;changed&quot;, function() { alert(&quot;Rotate!&quot;); });<br />
  42. 42. 偵測電源的狀態<br />偵測電源狀態的範例<br />varsystemState = <br />widget.createObject(&quot;SystemState&quot;);<br />varbatteryStrength = <br />systemState.PowerBatteryStrength;<br />alert(&quot;Battery strength:&quot; + batteryStrength.value);<br />batteryStrength.addEventListener( &quot;changed&quot;, <br />optimizeNetworkUsage );<br />
  43. 43. Widget與安全性<br />Widget受限於Sandbox安全管制機制<br />一種隔離未受信任的程式的機制<br />受管制的檔案存取功能<br />未具備存取登錄資訊(registry)的能力<br />未具備超連結至其他網頁的能力<br />可以利用#, 超連結至同一個網頁的其他內容<br />可以搭配下列的URL, 傳送SMS訊息, 電子郵件, 播打Skype網路電話, 或是播打一般的電話:<br />sms: mailto: callto:tel:<br />
  44. 44. Widget與安全性(續)<br />Widget擁有Cookie, 瀏覽歷史記錄, 和快取記憶體<br />每個Widget彼此獨立<br />允許跨越Domain呼叫Web服務(Cross Domain Data Access)<br />支援開發mash-up的必要功能<br />Windows Mobile 6.5 Widget是未簽署的程式<br />可以透過Windows Marketplace for Mobile進行部署<br />
  45. 45. 透過網站部署Widget<br />透過Web伺服器部署Widget<br />透過Windows Marketplace部署Widget<br />
  46. 46. 透過Web伺服器部署Widget<br />啟動[IIS管理員], 設定[電腦名稱(本機電腦)| 內容]<br />新增[MIME類型]<br /><ul><li>副檔名 =>.wgt
  47. 47. MIME類型 =>application/x-widget-app</li></ul>執行iisreset, 重新啟動IIS伺服器<br />
  48. 48. 透過Windows Marketplace部署Widget<br />Windows Marketplace Developer Portal<br />http://developer.windowsmobile.com<br />提供好用的搜尋功能<br />可以利用PC或行動裝置<br />進行下載<br />利用信用卡或手機費<br /> 率付費<br />24小時鑑賞期, 不滿意<br /> 可以退費<br />Windows Marketplace<br />軟體業者<br />電信業者<br />Application Store<br />
  49. 49. Widget開發最佳做法 (一)<br />與一般裝置應用程式具備相同的風格與操作體驗<br />善用Windows Mobile的功能表<br />為Widget準備一個有意義的icon圖示<br />圖示可以是 ICO, PNG,JPEG,Gif等常用的圖檔格式<br />使用和Windows Mobile相同的配色<br />使用Windows Mobile系統定義的色彩, 例如:Highlight, CaptionText, 等等…<br />請參考:User-Defined System Colors(網址:http://msdn.microsoft.com/en-us/library/aa358804(VS.85).aspx)<br />
  50. 50. Widget開發最佳做法 (二)<br />在所有的Windows Mobile 6.5裝置上都有良好的使用者介面配置<br />判斷裝置的解析度<br />利用widget.width和widget.height<br />使用和螢幕解析度相容的圖形<br />減少使用者使用捲軸的機會<br />於使用者旋轉置時調整Widget的大小和位置<br />
  51. 51. Widget開發最佳做法 (三)<br />提供良好的載入速度與互動性<br />在Widget載入完成後才執行建立動態內容的工作<br />執行耗時工作<br />利用非同步技巧執行, 避免等待過久<br />如果需要利用同步技巧執行, 請將工作切割成數個小部分, 每一部分的工作各自加上逾時控制<br />請注意<br />Javascript預設會以同步的技巧執行<br />
  52. 52. Javascript與執行效能最佳化<br />調整載入Javascript檔案(*.js)的順序<br />Widget載入不需要用到的Javascript檔案放在最後才執行載入<br />只載入Widget需要用到的Javascript檔案<br />使用DOM技巧取用Widget內容效率較差<br />例如document.appendChild<br />利用innerHtml, innerText, outerHtml, outerText屬性取用Widget內容效率較佳<br />
  53. 53. Widget開發最佳做法 (四)<br />妥善使用網路功能<br />偵測Widget狀態的變化, 適時更新Widget顯示的內容<br />在Widget被其他應用程式遮蓋時停止執行工作可以延長電池的續航力<br />將常用的資料保留在Windows Mobile裝置的記憶體中<br />提升資料取用的效率<br />利用AJAX技巧和遠端的Web服務溝通<br />避免等待<br />提升Widget的反應速度<br />
  54. 54. 使用IE8 script profiler<br />行動裝置處理器的運算速度較程式設計師使用的工作電腦的運算速度慢<br />IE8.0開發者工具列提供用來量測Javascript效能的工具<br />IE8.0開發者工具列提供的功能<br />有色彩標示的原始檔檢視功能<br />階層式CSS樣式預覽功能<br />HTML與CSS區段檢視<br />中斷與偵錯支援<br />Profile Javascript的執行效能<br />
  55. 55. IE8 script profiler執行的畫面<br />
  56. 56. 複習<br />認識Windows Mobile Widget<br />設計Widget的基本步驟<br />Widget與Web服務<br />閱讀即時新聞<br />自己動手做翻譯機<br />Widget與資料庫存取<br />與環境互動<br />Widget與安全性<br />透過網站部署Widget<br />Widget開發最佳做法<br />
  57. 57. 參考資料<br />Bing Developer Center http://www.bing.com/developers<br />Developing Widgets for Windows Mobile 6.5http://msdn.microsoft.com/en-us/library/dd721906.aspx<br />Discovering Internet Explorer Developer Tool http://msdn.microsoft.com/en-us/library/dd565628(VS.85).aspx<br />
  58. 58. 下載-資策會台北中心<br />http://www.iiiedu.org.tw/taipei<br />資訊專區<br />

×