【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