WindowsPhone開發之應用序程的生命週期

  • Launching 加載(程序開始)
  • Closing 關閉(程序結束)
  • Activated 活動的(程序處於激活狀態)
  • Deactivated 非活動的 (程序處於非活動狀態)
  • Dormant 休眠的(程序在後臺休眠)
  • Tombstoned 墓碑(程序消亡)

原文:http://wp.eoe.cn/thread-3981-1-2.html

在進行WP開發之前,與其它開發技術一樣,我們需要簡單瞭解一個WP應用序的生命週期,我們不一定要深入瞭解,但至少要知道在應用程序生命週期內的每一階段,我們應當做什麼,不推薦哪些操作等,這也是爲了讓我們開發出更高性能,更優秀的應用程序打下堅實的基礎。

下圖是官方給出的WP應用程序執行模型圖。

0_1329049273NOMZ.jpg 

在上圖中,我們要注意以下四個事件:
1、Launching 事件。
說白了,就是應用程序剛啓動時觸發的事件,由於這個事件的一點特殊性,儘量不要在該事件處理程序中做大量的操作,比如比較耗時間的作業,爲什麼呢?你想想,如果你的某個操作需要消耗大量時間的話,那麼,你肯定會發現,程序啓動的速度很慢,這樣一來,用戶會很不爽,用戶體驗就大打折扣。
2、Activated事件。
應用程序被激活時觸發,例如,我的程序上面有一個按鈕,用戶點擊後打開發短信的“窗口”,當用戶發送完短信後,發短信的頁面就關閉,這時候,我們的應用程序又從後臺程序變爲前臺程序了,Activated事件將觸發,注意的是,第一次啓動程序時是不觸發該事件的。
3、Deactivated事件。
與Activated事件相對,比如上面舉的例子,當我在程序上點擊按鈕時,發送短信的頁面將啓動,這時候,當前應用程序就被前面的發短信的頁面擋住了,也就是說,當前程序被髮送到後臺,這個時刻就觸發了Deactivated事件。不過,如果應用程序將關閉,該事件不觸發。
4、Closing事件。
從字面意思就猜到該事件在啥時候發生了。對,當應用程序關閉時發生,但在應用程在導航中被髮送到後臺時不發生,比如剛纔說的打開發短信的頁面後,雖然程序被髮送到後臺了,但由於它仍在運行,沒有退出,所以這個時候不觸發。但如果我從“開始”或桌面磁磚中啓動程序後,然後再通過“返回”鍵回到桌面,這個時候因爲程序會退出,所以該事件觸發。

爲了驗證這些事件是如何發生的,我們在app.xaml.cs文件中,分別爲這幾個事件寫下調
// 應用程序啓動(例如,從“開始”菜單啓動)時執行的代碼
    // 此代碼在重新激活應用程序時不執行;
    private void Application_Launching(object sender, LaunchingEventArgs e)
    {
             System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序首次啓動。");
    }
    // 激活應用程序(置於前臺)時執行的代碼
    // 此代碼在首次啓動應用程序時不執行
    private void Application_Activated(object sender, ActivatedEventArgs e)
    {
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序被激活。");
    }
    // 停用應用程序(發送到後臺)時執行的代碼
    // 此代碼在應用程序關閉時不執行
    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
    {
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序休眠。");
    }
    // 應用程序關閉(例如,用戶點擊“後退”)時執行的代碼
    // 此代碼在停用應用程序時不執行
    private void Application_Closing(object sender, ClosingEventArgs e)
    {
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序關閉。");
    }

// 應用程序啓動(例如,從“開始”菜單啓動)時執行的代碼        
// 此代碼在重新激活應用程序時不執行; 
       private void Application_Launching(object sender, LaunchingEventArgs e)
{ 
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序首次啓動。");
}        
// 激活應用程序(置於前臺)時執行的代碼        
// 此代碼在首次啓動應用程序時不執行        
private void Application_Activated(object sender, ActivatedEventArgs e)
{ 
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序被激活。");        }
// 停用應用程序(發送到後臺)時執行的代碼 
       // 此代碼在應用程序關閉時不執行 
       private void Application_Deactivated(object sender, DeactivatedEventArgs e)        
{ 
           System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序休眠。");        }
// 應用程序關閉(例如,用戶點擊“後退”)時執行的代碼        
// 此代碼在停用應用程序時不執行 
       private void Application_Closing(object sender, ClosingEventArgs e)        
{            
System.Diagnostics.Debug.WriteLine(DateTime.Now.ToShortTimeString() + " - 應用程序關閉。");
}



然後,我們運行程序,當主頁面出現後,點擊模擬器上的“返回”鍵把程序關閉。
這時候,我們再去看一下“輸出”窗口。


通過這個實驗,我們發現Activated事件和Deactivated事件未被觸發,爲什麼?自己思考吧。

下面,我們在頁面中放一個按鈕,點擊按鈕後,打開發送短信的頁面。
<button verticalalignment="Top"
 HorizontalAlignment="Center"
Content="請點擊我"FontSize="64"
 Click="Button_Click"Margin="0,12,0,0"/>



編寫單擊事件代碼。
privatevoid Button_Click(object sender, RoutedEventArgs e)
   {
          Microsoft.Phone.Tasks.SmsComposeTask sms = newMicrosoft.Phone.Tasks.SmsComposeTask();
          sms.To = "13672265138";
          sms.Body = "你好啊,今天中午請我吃牛肉炒飯嗎?";
          sms.Show();
   }
        privatevoid Button_Click(object sender, RoutedEventArgs e) 
{            
   Microsoft.Phone.Tasks.SmsComposeTask sms = newMicrosoft.Phone.Tasks.SmsComposeTask(); 
   sms.To = "13672265138";            
   sms.Body = "你好啊,今天中午請我吃牛肉炒飯嗎?";
     sms.Show();
       }


按F5運行,再點擊按鈕,打開發短信頁面。

看看“輸出”窗口,這時候,就看到Deactivated事件發生了,因爲程序還沒有退出,只是被放到後臺。

接着,點擊模擬器的“返回”,退回到我們的程序。再看看輸出窗口。

這個時候,Activated事件就發生了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章