[WP8] 生命週期簡介

今天來講講Windows Phone 8(WP8)App的生命週期,來介紹一下各週期的名稱。
Launching Event
當使用者在開始畫面點選動態磚,或是在列表中點選App,就會啟動(Launch)App,但如果是從通知訊息去點選而開啟App則不在此限。若是啟動,不會出現之前的使用狀態(比方說之前你遊戲玩到一半就跳出,啟動App表示你會從主選單開始)。
當你啟動一個新的App實例,啟動事件(Launching event)就會被引發。為了讓載入速度變快,需要讓一些較耗資源的操作移到背景去執行,你可以在處理這事件時加入一些code來做這些事情。
resource-intensive task: 需要大量系統資源或時間的處理過程、thread或是相關聯的處理過程或thread。
Running
啟動後,App就是運作中了(Running)。運作中的狀態會持續到使用者離開App或是離開App的第一頁。WP App不應該提供停止或離開的機制給使用者。當螢幕鎖定時也會離開運作中狀態,除非你關閉閒置偵測。
OnNavigatedFrom Method
只要使用者離開一個頁面,此方法(OnNavigatedFrom(NavigationEventArgs))就會被呼叫。離開App時也會呼叫此方法。無論如何,當此方法被呼叫時,都要儲存該頁面,以免使用者回到此頁面時,記憶體已經被清除。Backwards navagation時會有例外情況出現,可由NavigationMode屬性確認是否為Backwards navagation,這種情況是不需要去儲存該頁面資料的,因為下次該頁面會重新被創建。
Deactivated Event
Navagation forward或藉由按下Start或是啟動其他app來離開目前的app時,會引發此事件。
處理Deactivated事件時,需要把還沒儲存的資料給儲存以便下次使用(若有必要的話)。WP app有State物件可以儲存app狀態,如果你的app被系統給tombstones的話,這個字典物件會被儲存以備下次使用。
在Deactivated之後,App可能會完全結束,這樣的話,State字典不會被保存,所以在Deactivated事件引發時,最好要儲存所有應該保存的狀態。
Dormant
當使用者navigates forward、離開app,在Deactivated事件之後,系統會把app狀態改成Dormant。在此狀態下,所有thread都會停止,沒有任何處理過程會發生,但是app會留在記憶體內。這樣的話,若app由Dormant狀態中Deactivated,就不需要重新建置了。
若有新的app啟動,系統為了提供更多記憶體,舊的狀態是Dormant的app就會被tombstone。
Tombstoned
Tombstoned的app已經被終止,但是操作系統仍會保存有關navigation state以及於Deactivated時app留存的State字典。設備一次會保留最多五個Tombstoned的app的訊息。如果使用者回到已被Tombstoned的app,該app會被再次啟動,之前保存的資料會用來恢復狀態。
Activated Event
Activated事件會在使用者回到Dormant或Tombstoned狀態的app時所引發。你的app應該要檢查事件args的IsApplicationInstancePreserved屬性去決定他是否是由Dormant或Tombstoned狀態回傳的。若IsApplicationInstancePreserved為true,那app狀態是dormant,並且state是由系統自動留存。如果是false,那app狀態是tombstoned,必須要用state字典去恢復app狀態。App不應該在Activated時作太重的工作(resource-intensive tasks,像是由獨立的儲存器內做載入,或是網路資源),這樣會讓恢復的速度變慢,這些操作應該在app載入後放在背景thread去處理。因為你的app被reactivated時,在Deactivated時儲存的state字典在記憶體內,你可以使用它來恢復state而免去resource-intensive檔案操作的負擔。
OnNavigatedTo Method
此方法是當使用者到一個頁面時被呼叫。包含了app第一次啟動、使用者在app的兩個頁面間瀏覽以及於dormant或tombstoned後重新啟動。在這方法中,你的app應該要檢查這頁面是否是新的實例,若否,該頁面的狀態就不需被恢復,若是,而且有此頁面的state字典的資料,那你應該使用此資料去恢復頁面UI的state。
Closing Event
當使用者navigates backwards過app的第一頁時會引發。app會被終止,而且不會儲存任何資料。Closing事件處理器中,你的App能把應該要保存的資料給儲存下來。一個app有10秒的時間去完成所有application和page navigation事件。超過的話,applicaiton會終止。所以最好是在App的生命週期內儲存重要的資料並且避免在Closing事件處理器中處理大量的檔案I/O。

留言