日期:2014-05-17  浏览次数:20789 次

【windows8开发】Metro App生命周期之启动
前文介绍过Metro App的生命周期中的各个状态(NotRunning, Running, Suspended)以及概要性的说明了程序的启动,挂起,恢复,关闭等概念,而在本文中会通过相关代码,着重介绍Metro App在启动时的一些细节。本文中的示例代码会使用C++,因为都是基于WinRT,所以Javascript的实现的原理应该是类似的,如果有希望具体了解Javascript的实现方式的,可以在回复中留言。

前文中提到过,当用户启动Metro程序时,程序并不会马上进入Running状态,开始只是NotRunning状态,如果在此状态中程序发生异常导致crash或者被Suspended,则该程序会被终止而不会保留在内存中。从NotRunning状态切换到Running状态过程中,程序会显示一个splash screen,其实就是一张启动时等待用的图片,如下图:


在VS工程的manifest(.appxmanifest)文件中可以修改希望显示的splash图片,


显示Splash后,程序开始启动,这意味着可以开始执行程序的一些初始化工作,比如设定初期显示页面,事件绑定等。那么,在哪里能执行这些处理呢?在新建C++ Metro程序的工程后,可以看到有个App.xaml.h文件,里面会override一个OnLaunched方法,启动时,onLaunched方法会被调用,看下这个方法的具体实现:
void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ pArgs)
{
     if (pArgs->PreviousExecutionState == ApplicationExecutionState::Terminated)
     {
          //TODO: Load state from previously suspended application
     } else {
          ......
     }
     // Create a page which is defined in MainPage.xaml
     auto page = ref new MainPage();

     // Place the page in the current Window and ensure that it is active
     Window::Current->Content = page;
     Window::Current->Activate();
}

在OnLaunched中可以通过其参数的PreviousExecutionState属性来获得程序之前的执行状态,被正常关闭了,还是被挂起了,还是被强制终止了等等,在Windows::ApplicationModel::Activation::ApplicationExecutionState中定义了这些状态的值。程序可以根据之前状态的值执行相应的操作,一般的逻辑如下:
PreviousExecutionState值为Running, 则还原数据
PreviousExecutionState值为ClosedB