Windows Phone 8 如何在内存与硬件受限的设备上开发
最近看到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