幾個術語的理解:
名稱 |
說明 |
Launched |
啟動新程式的啟動 |
Closed |
通過Back按鍵關閉程式 |
Deactivated |
一個正在程式運行,此時按start鍵,程式停用,此後進入墓碑化 |
Activated |
程式從墓碑化複活,即啟用 |
那麼我們程式的生命週期也就大致顯示出來了:
生命週期的描述:當我們在start頁面運行一個程式A時,此時程式A進入啟動(Launched)階段,啟動完成之後,程式一般會相當長的時間處於running狀態,如果此時你按Back鍵,則直接進入Closed狀態,還有就是在運行過程中有突發事件,比如來電話,來資訊,或者你需要運行程式B,你就按Start鍵,在按Start鍵的時候處於Deactivated狀態,然後在運行程式B的過程中,程式A一直處於Tombstoning墓碑化狀態(除非你從Start頁重新啟用程式A的新執行個體),在操作程式B的過程中你如果長按Back鍵,系統會調出卡片式工作管理員,裡面就會包含程式A,程式B,Start頁面,如果點擊程式A,此時程式A就會被啟用,進入運行狀態,之至改程式被關閉,程式A的生命週期就完成了;
在App.xaml.cs檔案中可以找到改變這幾個狀態時所觸發的事件,事件裡面有註解就不在詳細說明了
// 應用程式啟動(例如,從“開始”菜單啟動)時執行的代碼 // 此代碼在重新啟用應用程式時不執行 private void Application_Launching(object sender, LaunchingEventArgs e) { //可以從隔離儲存區 (Isolated Storage)空間讀取資料進行初始化 } // 啟用應用程式(置於前台)時執行的代碼 // 此代碼在初次開機應用程式時不執行 private void Application_Activated(object sender, ActivatedEventArgs e) { //可以恢複臨時資料 } // 停用應用程式(發送到後台)時執行的代碼 // 此代碼在應用程式關閉時不執行 private void Application_Deactivated(object sender, DeactivatedEventArgs e) { //儲存臨時資料,以便使用者從墓碑化狀態啟用 } // 應用程式關閉(例如,使用者點擊“後退”)時執行的代碼 // 此代碼在停用應用程式時不執行 private void Application_Closing(object sender, ClosingEventArgs e) { //程式按Back鍵時,可以儲存到隔離儲存區 (Isolated Storage)空間 }
效果:
那麼下面的案例就是在使用者關閉程式後,在從工作管理員中重新啟用或者通過Back鍵返回到程式,進行資料的暫存;其實就是讓使用者感覺不到程式已經關閉了,當使用者程式回到程式時,和使用者離開時呈現出來的相一致;
由於MainPage.xaml頁面沒有任何修改,所以沒有貼出,MainPage隱藏檔案代碼:
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;//using Microsoft.Phone.Shell;namespace Tombstoned{ public partial class MainPage : PhoneApplicationPage { int sum = 0; App ap = (App)Application.Current; // 建構函式 public MainPage() { InitializeComponent(); } //經驗證此方法只有在程式啟動的時候才載入 private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) { //this.ApplicationTitle.Text = ap.appKey; } protected override void OnManipulationStarted(ManipulationStartedEventArgs e) { sum++; //程式標題處顯示 this.PageTitle.Text = sum.ToString(); ap.appKey = this.PageTitle.Text; base.OnManipulationStarted(e); } protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { if (!string.IsNullOrEmpty(ap.appKey)) { this.PageTitle.Text = ap.appKey; } base.OnNavigatedTo(e); } }}
從上面代碼中可以看出我們是把資料儲存到App類中的一個公用屬性中了,我們在觸摸事件中把自加的數值賦值於App公用屬性appKey,在MainPage頁面載入後調用OnNavigatedTo方法進行初始化,可以看出我們把臨時資料儲存在App類中了,那麼App類中是怎麼實現的那;App類隱藏檔案中添加的代碼如下:
public string appKey { get; set; }
即儲存資料的公用屬性,其中我們用到的兩個方法,並把他們實現:
// 啟用應用程式(置於前台)時執行的代碼 // 此代碼在初次開機應用程式時不執行 private void Application_Activated(object sender, ActivatedEventArgs e) { //可以恢複臨時資料 object str=string.Empty; if (PhoneApplicationService.Current.State.TryGetValue("key", out str)) { appKey=str.ToString(); } } // 停用應用程式(發送到後台)時執行的代碼 // 此代碼在應用程式關閉時不執行 private void Application_Deactivated(object sender, DeactivatedEventArgs e) { //儲存臨時資料,以便使用者從墓碑化狀態啟用 PhoneApplicationService.Current.State["key"] = appKey; }
可以看到我們是在使用者遇到突發事件(如電話)時用PhoneApplicationService.Current.State進行儲存的,並在使用者通過工作管理員或者Back鍵時啟用改程式,並用
PhoneApplicationService.Current.State.TryGetValue方法擷取值,該方法的好處是不會報出異常資訊
;工作管理員的的:
windows phone 7 對多個應用程式的管理:windows phone 7 是通過棧對多個程式進行管理的,當我們運行程式A的時候,如果我們需要運行程式B,那麼我們會按Start鍵,Start鍵就會把程式A壓入棧中(此時程式A是停止啟動並執行),如果需要運行程式C,同樣程式B也會被壓入棧中,那麼按Back鍵就會把當前程式C終止,並從棧中獲得最後一個壓入程式B,進行啟用使用;
源碼