最近看到Nokia Lumia 520 和 720 即將上市的訊息在網上熱議,相信這兩款手機會以更親民的價格快速進入市場,隨之開發人員一定會關心到的一個問題是由於硬體的差異我們在開發過程中需要注意或者做哪些更改呢?今天我跟大家聊聊在硬體功能受限的裝置上開的一些注意要點。
首先說下記憶體
明確兩個名稱“低記憶體裝置”和“高記憶體裝置” MSDN上的解釋是 1GB 以上記憶體的手機稱之為高記憶體裝置,也就是說1GB是這兩種裝置的分水嶺。
通過可以看到在我們的一般應用中 低記憶體裝置記憶體限制是 180MB,高記憶體裝置是380MB。
當然如果你想讓你的應用一些功能只運行在高記憶體的裝置上,得到一個最佳運行效果通過代碼是可以判斷實現的:
private void Application_Launching(object sender, LaunchingEventArgs e){ try { // Check the working set limit and set the IsLowMemDevice flag accordingly. Int64 result = (Int64)DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit"); if (result < 94371840L) MainPage.IsLowMemDevice = true; else MainPage.IsLowMemDevice = false; } catch (ArgumentOutOfRangeException) { // Windows Phone OS update not installed, which indicates a 512-MB device. MainPage.IsLowMemDevice = false; }}
當然這裡的 94371840L 是一個閥值 也可以自己設定。
參考 :http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/hh855083(v=vs.105).aspx
另外 我也也可以在低記憶體裝置上申請更多記憶體的使用空間(如果你需要)
<App>… <Requirements> <Requirement Name="ID_REQ_FRONTCAMERA"/> </Requirements> <FunctionalCapabilities> <FunctionalCapability Name="ID_FUNCCAP_EXTEND_MEM"/> </FunctionalCapabilities></App>
以上這段代碼示範了如何使用 ID_FUNCCAP_EXTEND_MEM 在低記憶體裝置上當應用記憶體使用量超過180MB後不強制退出。
<App>… <Requirements> <Requirement Name="ID_REQ_FRONTCAMERA" /> <Requirement Name="ID_REQ_MEMORY_300" /> </Requirements></App>
並且聲明了ID_REQ_MEMORY_300 表示次應用不會被低記憶體裝置搜到以及禁止被安裝。
如果你想在你的應用中減少記憶體使用量可以注意以下事項:
- WebBrowser,地圖,相機都會有額外的記憶體開銷,儘可能的使用 windows phone 啟動器/選取器
- 避免使用長的資料列表,如果使用,確保是分頁的。按需載入資料,而不是一次性載入全部資料。
- 避免使用具有映像的複雜項目範本。如果使用了,則監視應用的記憶體使用量。
- 避免對頁面過渡使用複雜動畫。這包括 Windows Phone 工具包中的過渡。如果使用過渡,請確保應用保持響應,並測試頁面過渡期間應用的記憶體使用量。
- 注意,如果使用者在運行應用時更改裝置方向,則應用所用的記憶體可能會增加。應在方向更改時測試應用,並且如果應用通常超過 90-MB(180MB) 的記憶體限制,應取消低記憶體裝置。
硬體要求瞭解應用資訊清單檔:
要修改資訊清單檔,您可以使用清單設計器。但是,在某些情況下您還必須手動編輯檔案的 XML 內容。例如,當以下任意條件為真時,您必須手動編輯 XML:
- 聲明應用使用了擴充關聯屬性。
- 聲明應用使用了位置服務並在後台運行。
- 聲明應用無法在記憶體受限的裝置上運行。
清單設計器有四個頁面:
- 應用程式 UI
- 功能
- 要求
- 打包
應用程式 UI 沒有什麼特別都樣。
功能頁面:這裡面的是聲明你的應用程式會涉及到那些API的使用,在此聲明後才可以在應用中使用,否則該功能會在裝置中禁用。
硬體要求和確定功能列表請參考:
硬體要求 http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206936(v=vs.105).aspx
功能列表 http://msdn.microsoft.com/en-us/library/windowsphone/develop/gg180730(v=vs.105).aspx
這裡的選項會顯示在市集的提示中,例如:此應用會擷取你的地理位置資訊,擷取你的通訊錄資訊,更改你的鎖屏圖片等...
要求頁面
通過勾選以上硬體資訊可以防止你的應用安裝到不支援次硬體要求的裝置上:
當然我們在代碼中也都是可以禁用和判斷這些功能是否支援,在這裡我建議大家在儘可能的情況下通過代碼的方式來 設配一些硬體不支援的情況,在沒有辦法的情況下載拋棄部分裝置。
例如判斷一個裝置是否支援閃光燈並且控制開啟關閉的代碼如下:
// Activate a flash mode. // Cycle through flash mode options when the flash button is pressed. private void changeFlash_Clicked(object sender, RoutedEventArgs e) { switch (cam.FlashMode) { case FlashMode.Off: if (cam.IsFlashModeSupported(FlashMode.On)) { // Specify that flash should be used. cam.FlashMode = FlashMode.On; FlashButton.Content = "Fl:On"; currentFlashMode = "Flash mode: On"; } break; case FlashMode.On: if (cam.IsFlashModeSupported(FlashMode.RedEyeReduction)) { // Specify that the red-eye reduction flash should be used. cam.FlashMode = FlashMode.RedEyeReduction; FlashButton.Content = "Fl:RER"; currentFlashMode = "Flash mode: RedEyeReduction"; } else if (cam.IsFlashModeSupported(FlashMode.Auto)) { // If red-eye reduction is not supported, specify automatic mode. cam.FlashMode = FlashMode.Auto; FlashButton.Content = "Fl:Auto"; currentFlashMode = "Flash mode: Auto"; } else { // If automatic is not supported, specify that no flash should be used. cam.FlashMode = FlashMode.Off; FlashButton.Content = "Fl:Off"; currentFlashMode = "Flash mode: Off"; } break; case FlashMode.RedEyeReduction: if (cam.IsFlashModeSupported(FlashMode.Auto)) { // Specify that the flash should be used in the automatic mode. cam.FlashMode = FlashMode.Auto; FlashButton.Content = "Fl:Auto"; currentFlashMode = "Flash mode: Auto"; } else { // If automatic is not supported, specify that no flash should be used. cam.FlashMode = FlashMode.Off; FlashButton.Content = "Fl:Off"; currentFlashMode = "Flash mode: Off"; } break; case FlashMode.Auto: if (cam.IsFlashModeSupported(FlashMode.Off)) { // Specify that no flash should be used. cam.FlashMode = FlashMode.Off; FlashButton.Content = "Fl:Off"; currentFlashMode = "Flash mode: Off"; } break; } // Display current flash mode. this.Dispatcher.BeginInvoke(delegate() { txtDebug.Text = currentFlashMode; }); }
更多的程式碼範例和解釋請參考: http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj206936(v=vs.105).aspx#BKMK_Hardwarerequirements
打包頁面
您也可以指定預設語言和該頁面支援的其他語言。您為預設語言和支援的語言提供的值決定了使用者在 Store 中看到的您的應用的語言支援情況。您可以手動編輯這兩個值。但是,它們與項目屬性中的非特定語言和支援的地區性設定密切相關。對於所有裝置是樣的。
歡迎大家在這裡和我溝通交流或者在新浪微博上 @王博_Nick