Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装。本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的安装包。这就意味着我们要先把Windows从8升级到8.1,再把VS从2012升级到2013。又是折腾了一个够。可能有人说这个Update2还是RC版,要等到Release放出。我觉得这个安装包就是Release了,要等WP8.1出来后再改名儿,要不WP8.1还没出,SDK的Release先放出来了容易让人诟病。这篇文章就来讨论一下那些在WP8.1SDK中的新特性们。
Universal Apps是一个统一的项目,可以将Windows Store和Windows Phone 8.1创建在一个项目中,直接用一套Core,两个UI。这绝对是一个非常有用的功能。上面的项目模板中你感觉到陌生的可能是Hub App,其实就是之前的Panorama项目,名字被改成了Hub。这次我们就来创建一个Windows Phone8.1的项目。而且只能创建WP8.1的项目,不像VS2012一样可以选择创建7.1还是8.0的项目。我想微软可能是出于目前所有8.0的手机都可以免费升级到8.1的考虑,不过我想今后的一段时间8.0的项目还将是主流。
上面这张图就是创建好的项目了。首先你感觉到的也是最大的变化就是所有的命名空间怎么都是Windows Store里的,这就是前面提到的存在Universal App的原因。在WP8.1的SDK中所有的命名空间简直大换血,完全和Windows Store统一,不再是单独的一套API命名。不光是命名空间,这次变更做的非常之彻底,彻底到连Windows Store中的控件都直接可以再WP中使用,比如,FlipView, GridView, ListView, RichEditBox, PasswordBox, SemanticZoom。
2、应用生命周期
为了尽可能的重用WP中的代码,应用可以在多任务列表里关闭。所以WP的生命周期有了非常大的变化,总共有三种状态Running、Suspended、NotRunning。
你的应用可能从多种途径启动,可能是用户直接启动或者是从tile启动。在进入到Running状态之前应用会进入Activated状态,在这个状态我们可以判断应用的上一个状态,从而判断是否有上次退出之前保存的数据。重写OnLaunched事件,这个事件在每次启动应用的时候被执行。
async protected override void OnLaunched(LaunchActivatedEventArgs args) { if (args.PreviousExecutionState == ApplicationExecutionState.Terminated || args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser) { // TODO: Populate the UI with the previously saved application data } else { // TODO: Populate the UI with defaults } if (Window.Current.Content == null) { Window.Current.Content = new MainPage(); } Window.Current.Activate(); }
PreviousExcutionState代表应用打开之前的状态,ApplicationExcutionState有三种状态,如果是Terminated,代表程序是被系统后台关闭的,那么可能有我们之前保存的数据。ClosedByUser和NotRunning代表应用是被用户关闭或者为启动的状态,要进行一次完整的启动应用。如果用户让应用进入到后台,那么操作系统会给一点时间来相应用户的重新开启应用,如果用户没有立即启动后台的应用那么系统会将应用置成Suspend挂起状态。大部分应用进入后台状态时都会停止运行。
系统会保持尽量多的后台应用挂起,用户一旦启动后台应用,可以得到一个更快的启动速度。然而如果后台挂起的应用过多,那么系统会自动关闭一些应用,而且应用不会收到任何的通知,所以如果后台应用有需要保存的数据,就需要在Suspended状态的时候保存。通过订阅Application.Current.Suspending事件来保存重要数据。在应用进入Suspending状态后的1到10秒钟没有在重新打开应用,系统会认为应用已经停止响应并将其挂起进入Suspened状态。
如果你在在应用挂起时使用异步的方法来保存数据,那么你可以通过GetDeferral方法来推迟挂起事件,直到你的任务完成后再调用SuspendingDeferral的Complete方法来告知系统你的异步任务已经完成,可以进入Suspended状态了。如果一个被挂起的应用被重新唤起,将先触发Resuming事件再触发Activated事件。
3、程序内导航
在WP8.1中用户可以通过back键来进入Suspended状态而不是直接退出应用。这个功能和以往的WP应用不同,通过注册BackPressed事件。当用户点击back键的时候将触发,通过设置BackPressedEventArgs.Handled为true告知系统将应用放到后台设为Suspended状态。如果你的应用在第一页并不能再向后导航,那么你不应该处理这个事件,系统将直接挂起你的应用。在默认的项目模板中默认处理了这个逻辑。
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e) { Frame frame = Window.Current.Content as Frame; if (frame == null) { return; } if (frame.CanGoBack) { frame.GoBack(); e.Handled = true; } }
4、SD卡读写的支持
在WP8中开发者只能读SD卡上的内容,在WP8.1中如果应用注册了文件类型处理那么就可以对SD卡进行写的操作。具体可以点击这里查看。
5、数据漫游
在WP8.1中提供数据漫游的功能,漫游的数据大小限制在100KB。只有在设备处于锁屏状态和系统不繁忙的情况下才会漫游数据。漫游的数据可以在不同版本的应用之间使用,适合在Windows Store和Windows Phone Store之间分享数据。具体的如何实现可以点击这里。
6、后台传输
在WP8.1中你可以通过Windows.Networking.BackgroundTransfer实现后台上传或者下载传输,这个过程完全是由系统完成的,即使你的应用在没有打开的情况下。
7、在通知中心管理toast
在WP8.1中引入了新版的通知中心,开发者可以管理通知中心中的toast。通过Windows.UI.NotificationsAPI开发者可以对通知中心中的通知进行添加、删除、替换和过期等设置。详细的设置可以点击这里查看。
随着昨晚WP8.1开发者预览版的推送,正式版估计也不远了。看了What's new in WP8.1 SDK我倒是觉得对用户来讲新的功能其实不多,但对开发者来说更新的内容很多。将升级到8.1确实要费一番功夫,不过也方便了以后的Windows8的开发。上面只列出了我觉得有意思的一些features,上面也给出了链接可以看全部的更新。