處理應用程式啟用
瞭解如何透過覆寫 Application.OnLaunched 方法來處理應用程式啟用。
注意
如需在傳統型應用程式中處理啟用的相關資訊,請參閱 取得已封裝應用程式的啟用資訊。 另請參閱 GitHub 上的 AppLifecycle - 豐富啟用。
覆寫啟動處理程式
啟動應用程式時,基於任何原因,系統會傳送 CoreApplicationView.Activated 事件。 如需啟用類型清單,請參閱 ActivationKind 列舉。
Windows.UI.Xaml.Application 類別會定義您可以覆寫以處理各種啟用類型的方法。 數種啟用類型都有您可以覆寫的特定方法。 若為其他啟用類型,請覆寫 OnActivated 方法。
定義應用程式的類別。
<Application
x:Class="AppName.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
覆寫 OnLaunched 方法。 每當使用者啟動應用程式時,就會呼叫這個方法。 LaunchActivatedEventArgs 參數包含您應用程式的先前狀態和啟用自變數。
注意
在 Windows 上,從開始磚或應用程式清單啟動暫停的應用程式不會呼叫此方法。
using System;
using Windows.ApplicationModel.Activation;
using Windows.UI.Xaml;
namespace AppName
{
public partial class App
{
async protected override void OnLaunched(LaunchActivatedEventArgs args)
{
EnsurePageCreatedAndActivate();
}
// Creates the MainPage if it isn't already created. Also activates
// the window so it takes foreground and input focus.
private MainPage EnsurePageCreatedAndActivate()
{
if (Window.Current.Content == null)
{
Window.Current.Content = new MainPage();
}
Window.Current.Activate();
return Window.Current.Content as MainPage;
}
}
}
Class App
Protected Overrides Sub OnLaunched(args As LaunchActivatedEventArgs)
Window.Current.Content = New MainPage()
Window.Current.Activate()
End Sub
End Class
...
#include "MainPage.h"
#include "winrt/Windows.ApplicationModel.Activation.h"
#include "winrt/Windows.UI.Xaml.h"
#include "winrt/Windows.UI.Xaml.Controls.h"
...
using namespace winrt;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Controls;
struct App : AppT<App>
{
App();
/// <summary>
/// Invoked when the application is launched normally by the end user. Other entry points
/// will be used such as when the application is launched to open a specific file.
/// </summary>
/// <param name="e">Details about the launch request and process.</param>
void OnLaunched(LaunchActivatedEventArgs const& e)
{
Frame rootFrame{ nullptr };
auto content = Window::Current().Content();
if (content)
{
rootFrame = content.try_as<Frame>();
}
// Do not repeat app initialization when the Window already has content,
// just ensure that the window is active
if (rootFrame == nullptr)
{
// Create a Frame to act as the navigation context and associate it with
// a SuspensionManager key
rootFrame = Frame();
rootFrame.NavigationFailed({ this, &App::OnNavigationFailed });
if (e.PreviousExecutionState() == ApplicationExecutionState::Terminated)
{
// Restore the saved session state only when appropriate, scheduling the
// final launch steps after the restore is complete
}
if (e.PrelaunchActivated() == false)
{
if (rootFrame.Content() == nullptr)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(xaml_typename<BlankApp1::MainPage>(), box_value(e.Arguments()));
}
// Place the frame in the current Window
Window::Current().Content(rootFrame);
// Ensure the current window is active
Window::Current().Activate();
}
}
else
{
if (e.PrelaunchActivated() == false)
{
if (rootFrame.Content() == nullptr)
{
// When the navigation stack isn't restored navigate to the first page,
// configuring the new page by passing required information as a navigation
// parameter
rootFrame.Navigate(xaml_typename<BlankApp1::MainPage>(), box_value(e.Arguments()));
}
// Ensure the current window is active
Window::Current().Activate();
}
}
}
};
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace AppName;
void App::OnLaunched(LaunchActivatedEventArgs^ args)
{
EnsurePageCreatedAndActivate();
}
// Creates the MainPage if it isn't already created. Also activates
// the window so it takes foreground and input focus.
void App::EnsurePageCreatedAndActivate()
{
if (_mainPage == nullptr)
{
// Save the MainPage for use if we get activated later
_mainPage = ref new MainPage();
}
Window::Current->Content = _mainPage;
Window::Current->Activate();
}
如果應用程式暫停,請還原應用程式資料,然後終止
當使用者切換至終止的應用程式時,系統會傳送 Activated 事件,並將 Kind 設定為 Launch,而 PreviousExecutionState 設定為 Terminated 或 ClosedByUser。 應用程式應該載入其已儲存的應用程式資料,並重新整理其顯示的內容。
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
}
EnsurePageCreatedAndActivate();
}
Protected Overrides Sub OnLaunched(args As Windows.ApplicationModel.Activation.LaunchActivatedEventArgs)
Dim restoreState As Boolean = False
Select Case args.PreviousExecutionState
Case ApplicationExecutionState.Terminated
' TODO: Populate the UI with the previously saved application data
restoreState = True
Case ApplicationExecutionState.ClosedByUser
' TODO: Populate the UI with the previously saved application data
restoreState = True
Case Else
' TODO: Populate the UI with defaults
End Select
Window.Current.Content = New MainPage(restoreState)
Window.Current.Activate()
End Sub
void App::OnLaunched(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs const& e)
{
if (e.PreviousExecutionState() == ApplicationExecutionState::Terminated ||
e.PreviousExecutionState() == ApplicationExecutionState::ClosedByUser)
{
// Populate the UI with the previously saved application data.
}
else
{
// Populate the UI with defaults.
}
...
}
void App::OnLaunched(Windows::ApplicationModel::Activation::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
}
EnsurePageCreatedAndActivate();
}
如果 PreviousExecutionState 的值 是 NotRunning,則應用程式無法成功儲存其應用程式資料,而且應用程式應該會啟動,就好像一開始啟動一樣。
備註
注意
如果目前視窗上已設定內容,應用程式可以略過初始化。 您可以檢查 LaunchActivatedEventArgs.TileId 屬性,以判斷應用程式是否已從主要或次要磚啟動,並根據該資訊,決定是否應該呈現全新或繼續的應用程式體驗。