Windows 8 引入全新應用生命週期模型:**使用者不再手動關閉應用**,系統根據資源壓力 (記憶體、CPU、電池) 自動 **掛起** 背景應用,必要時 **終止** 以釋放資源。開發者必須正確處理 `Suspending` (5 秒存檔)、`Resuming` (還原 UI)、`Activated` (啟動/從終止恢復) 三大事件,確保使用者感覺應用「永遠在運行」。


| 狀態 | 觸發條件 | 系統動作 | 應用必做 |
|---|---|---|---|
| Running (執行中) | 使用者啟動/切換至應用 | 發送 `Activated` 事件 (`Kind=Launch` 或 `Kind=Switch`) | `OnLaunched` 初始化 / `OnActivated` 恢復導航狀態 |
| Suspending (掛起中) | 使用者切換離開 (Win+Tab, Start, 其他應用) | 發送 `Suspending` 事件,**5 秒內必須完成** (超時即終止) | **序列化所有暫態狀態** (導航堆疊、表單輸入、暫存資料) 至 `ApplicationData.LocalSettings/Folder`;釋放獨佔資源 (檔案控制代碼、網路連線、感測器、媒體引擎)。 |
| Suspended (已掛起) | 掛起完成 | 進程保留在記憶體,**凍結所有執行緒**,不消耗 CPU/磁碟/網路 | 無程式碼執行 |
| Resuming (恢復中) | 使用者切回應用 (從掛起狀態) | 發送 `Resuming` 事件,進程解凍,變數/記憶體狀態完整保留 | **刷新可能過期的 UI** (新聞列表、即時資料、地理位置、Token 續期);**無需重新載入已序列化狀態** (記憶體尚在)。 |
| Terminated (已終止) | 系統記憶體不足 / 使用者關閉應用 (下拉關閉) / 系統關機 / 應用崩潰 | **無任何事件通知**,進程直接殺掉,記憶體釋放 | **下次啟動時** (`Activated` -> `OnLaunched` `PreviousExecutionState == Terminated`) **從本地儲存還原完整狀態**。 |






// App.xaml.cs
protected override void OnLaunched(LaunchActivatedEventArgs args) {
// args.PreviousExecutionState: NotRunning, Running, Suspended, Terminated, ClosedByUser
if (args.PreviousExecutionState == ApplicationExecutionState.Terminated) {
// 從終止恢復:載入儲存的 SessionState
await RestoreSessionStateAsync();
} else if (args.PreviousExecutionState == ApplicationExecutionState.Suspended) {
// 從掛起恢復:記憶體完整,僅需刷新 UI
RefreshUI();
} else {
// 冷啟動
InitializeApp();
}
// 通用導航邏輯
if (rootFrame.Content == null) rootFrame.Navigate(typeof(MainPage), args.Arguments);
Window.Current.Activate();
}
protected override void OnActivated(IActivatedEventArgs args) {
// 處理非啟動激活:Search, Share, File, Protocol, Toast, Contact 等
if (args.Kind == ActivationKind.Search) { /* ... */ }
// 確保視窗啟動
Window.Current.Activate();
}
private async void OnSuspending(object sender, SuspendingEventArgs e) {
var deferral = e.SuspendingOperation.GetDeferral(); // 非同步存檔必須取得 Deferral
try {
// 1. 儲存導航狀態 (Frame.GetNavigationState)
// 2. 儲存頁面級暫態資料 (實作 ISuspendable 接口的頁面自行存檔)
// 3. 儲存應用級設定/暫存資料
await SaveSessionStateAsync();
// 4. 釋放獨佔資源
ReleaseExclusiveResources();
} finally {
deferral.Complete(); // 必須調用,否則系統視為超時而終止
}
}
private void OnResuming(object sender, object e) {
// 記憶體完整,ViewModel 狀態仍在
// 僅刷新可能過期的資料:新聞、即時股價、地理位置、OAuth Token
foreach (var page in GetActivePages()) {
if (page is IRefreshable) ((IRefreshable)page).RefreshData();
}
}

| 場景 | 必做事項 | 禁止事項 |
|---|---|---|
| 一般恢復 (掛起→恢復) | 還原導航堆疊、刷新過期 UI、延遲載入非關鍵資料 | 重新初始化整個應用、清空使用者輸入 |
| 終止後恢復 | 從 LocalFolder 完整還原 SessionState、驗證資料完整性 | 假設記憶體狀態仍在、忽略 PreviousExecutionState |
| 長時間未使用 (天/週) | 提供「重新開始」選項、清理過期快取 | 強制恢復舊會話 (可能資料已失效) |
| 應用崩潰後啟動 | PreviousExecutionState == NotRunning (視同冷啟動)、上報崩潰日誌 | 嘗試恢復崩潰前狀態 (資料可能損毀) |
冷啟動/終止恢復若需 > 2 秒初始化 (載入大量資料、資料庫遷移、雲端同步),應實作 **Extended Splash Screen**:
Windows 8 應用生命週期的核心契約:**系統承諾盡力保留進程 (掛起),開發者承諾 5 秒內持久化所有可恢復狀態。** 掌握 `Suspending` (存檔)、`Resuming` (刷新)、`OnLaunched` (冷啟動/終止恢復分流) 三大入口,配合 `SuspensionManager` 標準化序列化流程,即可構建「永不遺失狀態、瞬間響應切換」的專業級應用體驗。