Windows Phone應(yīng)用程序生命周期
前言
如果在以往,您有用過之前的 Mobile 操作系統(tǒng),像是 WM5.x、WM6.x ,是允許你在同時間執(zhí)行很多應(yīng)用程序;而應(yīng)用程序的默認(rèn)行為,在 Form 的右上角是一個『 X 』的按鈕,按鈕按下去之后,應(yīng)用程序是躲到了背景,仍在繼續(xù)在執(zhí)行;而到了Windows Phone 7,這樣的行為模式變更了,在前景一次只能執(zhí)行一個應(yīng)用程序,而原先的應(yīng)用程序發(fā)生了什么事?這就是本篇要跟各位介紹的;而第二個部分是在應(yīng)用程序中,可 能會存在好幾個頁面,而彼此間要怎么傳遞數(shù)據(jù)呢?
這都是今天會談?wù)摰降淖h題,那么接下來就開始今天的介紹
議程
Application life cycle
Page Navigation
在頁面中傳遞數(shù)據(jù)
Idle detection
Application life cycle
由于在 Windows Phone 7 中,應(yīng)用程序的運作方式跟以往的 Mobile 系列不同,所以在開發(fā)應(yīng)用程序時要留意有關(guān)生命周期的事件,以便在需要的地方加以處理;事件的種類會有
Launching
Closing
Activated
Deactivated
而這些事件是在甚么時候會發(fā)生呢?下面先來看看第一種狀況
程序生命周期
應(yīng)用程序『第一次的啟動』一定是由首頁的 Tile 或是由應(yīng)用程序行表中啟動,而啟動之后便會產(chǎn)生新的應(yīng)用程序?qū)嵗又蜁M(jìn)入到 Launching 事件中;在 Launching 事件中您可以做一些初始化的動作,需要特別注意的是在 Launching 事件中, 不適合去做長時間的動作,因為 Launching 事件是發(fā)生在頁面顯示之前,所以在Launching 事件沒有完成之前,頁面都是看不到的,整個屏幕都會是黑黑的一片,所以執(zhí)行長時間的作業(yè)的話,是很容易被誤認(rèn)為應(yīng)用程序停止響應(yīng)或是其他的異常情形,這是 不好的。
經(jīng)過Launching 的事件之后,應(yīng)用程序的第一個頁面就會顯示出來,這時候會進(jìn)入到應(yīng)用程序執(zhí)行中 ( Running ) 的狀態(tài),而在應(yīng)用程序的第一個頁面時,如果使用者按下返回鍵,這個時候就會直接引發(fā) Closing 的事件,Closing 事件之后就會把應(yīng)用程序整個關(guān)閉了。
那么,如果在應(yīng)用程序的第一個頁面中,使用者按下了開始鈕 ( ) ,那這時候呢?關(guān)閉應(yīng)用程序嗎?不,這時候應(yīng)用程序會進(jìn)入tombstoning,之后移到背景,讓我們來看看下一張圖
程序生命周期2
當(dāng)在第一個頁面中,使用者按下開始鈕,這個時候應(yīng)用程序便會進(jìn)入 Deactivated 的事件,之后便進(jìn)入 tombstoning 的狀態(tài),也就是整個應(yīng)用程序會停止運作,這跟之前的 Mobile 5.x/6.x 是有很大的不同的。而在 Deactivated 事件之后,使用者這時候可能會執(zhí)行其他的應(yīng)用程序或進(jìn)行其他的操作,之后可能會按下返回鍵回到應(yīng)用程序的執(zhí)行,這個時候就會進(jìn)入 Activated 事件, Activated 事件處理完畢之后,便會回到執(zhí)行中的狀態(tài);那在這兩個事件中,要處理甚么呢?您可以在這個事件中去儲存一些暫時性的數(shù)據(jù),而這些數(shù)據(jù)同時又是屬于整個應(yīng)用 程序會使用到的,就可以在這些事件中去處理。
Deactivated 事件還有個地方需特別注意,所有在 Deactivated 事件中處理的事情,必需要在 10 秒鐘之內(nèi)處理完畢,不然的話系統(tǒng)會強制的中止你的應(yīng)用程序,而假設(shè)發(fā)生這種狀況的話,程序是被整個關(guān)閉,按下返回鍵是不會回到應(yīng)用程序中的,這點必須特別 留意。
舉個簡單的例子,例如說一個很簡單的游戲程序,程序中會有總分?jǐn)?shù)的紀(jì)錄,像是下面左圖樣子,現(xiàn)在是 50 分,那如果不小心按到開始鈕或是其他的原因,離開了應(yīng)用程序,再返回的時候,糟糕..這時候會像下面右圖一樣,變成 0 分了;如果沒有適當(dāng)?shù)娜ヌ幚磉@個部份,那對使用者來說是會覺得很疑惑,而且不是一個好的應(yīng)用程序的。
程序生命周期3
這個時候就可以處理 Deactivated、Activated 事件,在相關(guān)的事件中去做儲存的事件,舉個簡單的例子;筆者首先在 App.xaml.cs 中加入一個 HighScore 的全局變量
public static int HighScore;
之后在 App.xaml.cs 中處理相關(guān)的事件 ( Application life cycle 相關(guān)的事件在 App.xaml.cs 中都可以找到 )
- // Code to execute when the application is activated (brought to foreground)
- // This code will not execute when the application is first launched
- private void Application_Activated(object sender, ActivatedEventArgs e)
- {
- object tmp = 0;
- if (PhoneApplicationService.Current.State.TryGetValue("Score", out tmp))
- {
- App.HighScore = (int)tmp;
- }
- else
- App.HighScore = 0;
- }
- // Code to execute when the application is deactivated (sent to background)
- // This code will not execute when the application is closing
- private void Application_Deactivated(object sender, DeactivatedEventArgs e)
- {
- PhoneApplicationService.Current.State["Score"] = App.HighScore;
- }
最后,在 MainPage.xaml.cs 中,Loaded 事件中,把值給讀出來顯示
- private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
- {
- tbScore.Text = App.HighScore.ToString();
- }
這樣子,不管是不小心誤觸到其他按鍵或者是其他原因離開了應(yīng)用程序都可以正常的保留住想要保留的數(shù)據(jù)了。
而在上面的程序代碼中,您會看到 PhoneApplicationService.Curent.State ,這是一個實做 IDictionary 的類別,使用時要加入 Microsoft.Phone.Shell 的命名空間,之后就可以它用來儲存一些應(yīng)用程序中的數(shù)據(jù)。
注:應(yīng)用程序執(zhí)行中,用戶按下開始鈕,或是執(zhí)行 Lanucher/Chooser 、拍照等等,或是一段時間沒有使用而進(jìn)入鎖定;只要是離開應(yīng)用程序本身,就會開始進(jìn)入 Deactivated 事件
Page Navigation
在剛剛我們看過了應(yīng)用程序的生命周期,那么頁面呢?緊接著就來看看在頁面顯示的過程中,以及在頁面中去巡覽的時候,應(yīng)用程序是如何處理這些事件的;在這邊需要注意的是件有
Loaded
每一次頁面的載入完成時,都會引發(fā) Loaded 事件
Unloaded
當(dāng)從這個頁面要巡覽到另外一個頁面時,就會引發(fā) Unload 事件
OnNavigatedFrom
當(dāng)利用 NavigationService ,要從頁面離開時會引發(fā) OnNavigatedForm 事件,使用時必須要覆寫 Page 事件
OnNavigatedTo
當(dāng)利用 NavigationService ,尋覽到新的頁面時,會引發(fā)新頁面的 OnNavigatedTo 事件,使用時必須要覆寫 Page 事件
其中如果要處理 OnNavigatedTo、OnNavigatedForm 事件是必須利用覆寫的方式來使用,而事件發(fā)生的順序會是 OnNavigatedTo à Load à OnNavigatedForm à UnLoaded。
而在 Page 的這些事件中,要處理甚么動作呢?在頁面相關(guān)的事件中,要處理的是必須要儲存一些暫時性的數(shù)據(jù),以便在巡覽的過程中使用;以及在頁面中傳遞數(shù)據(jù)等動作。當(dāng)要進(jìn)行頁面的巡覽動作,通常會利用 NavigationService 來做,例如
- NavigationService.Navigate(new Uri("/ThirdPage.xaml",
- UriKind.Relative));
利用這個方式就可以巡覽到下一個頁面,那退回上一個頁面呢?這時候可以利用 GoBack 的方式來返回,例如
- NavigationService.GoBack();
那如果不用 GoBack 的方式,直接也利用 Navigate 的方式指定頁面名稱呢?當(dāng)然也是可以巡覽到指定的頁面,但是要注意的是,利用 Navigate 方法時,是會產(chǎn)生一個『新』的目標(biāo)頁面的,這是兩個方式不同的地方;舉個簡單的例子來說;假設(shè)在 MainPage 當(dāng)中,擺放了一個 TextBox ,輸入一些文字之后,巡覽到 SecondPage ;這時候如果使用 GoBack 的方式(或是按下硬件的返回鍵),您會發(fā)現(xiàn) TextBox 會記住剛剛輸入的文字,而如果是用 Navigate 加上指定頁面的方式,您會發(fā)現(xiàn) TextBox 的文字會是默認(rèn)的初始設(shè)定,而不會是剛剛輸入的文字。
到這里,相信您對于頁面以及應(yīng)用程序的生命周期有大略的認(rèn)識與了解,而在這些事件 中,最常需要處理的就是去保存應(yīng)用程序相關(guān)的狀態(tài);主要在 Deactivated 以及 Activated 這類事件中處理的是整個應(yīng)用程序通用性的數(shù)據(jù)或是狀態(tài);而 OnNavigateTo 這類事件中則是處理頁面使用的暫時數(shù)據(jù)或是處理其他傳遞過來的數(shù)據(jù),接下來就來看一下,在各個頁面中傳遞數(shù)據(jù)是用什么方式進(jìn)行,以及如何去保存一些應(yīng)用程 序的狀態(tài)。
在頁面中傳遞數(shù)據(jù)
傳遞數(shù)據(jù)數(shù)據(jù)的方式有很多種,可以依照不同的狀況去使用,下面筆者大致列出幾種方式,您可以依照使用的情境以及需求做調(diào)整
利用全局變量的方式
自行宣告全局變量或是在 App 類別中 ( App.xaml.cs ) ,去建立相關(guān)的屬性 ( property ) 或是字段 ( flied )
例如說,筆者在 App.xaml.cs 中去新增一個字符串變量,大概像這個樣子
- public static string SharedString = "";
之后在主要頁面 ( main page ) 中,就可以利用下面的方式來儲存要傳遞的數(shù)據(jù)
- App.SharedString = textBox1.Text;
- NavigationService.Navigate(new Uri("/Page_UseApp.xaml",
- UriKind.Relative));
而接著在新的頁面中,就可以在 OnNavigateTo 的事件中去取值,并且把值顯示出來,例如
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- textBox1.Text = App.SharedString;
- }
筆者這邊是利用簡單的字符串變量來做示范,實際使用時您也可以用自定義類別或是其他的數(shù)據(jù)類型來使用,這就看您實際的需求;而在 App 類別中的相關(guān)數(shù)據(jù)是整個應(yīng)用程序都可以共享的。
利用 Url 參數(shù)傳遞
利用像是 SecondPage.xaml?para1=12345¶2=aaaaa 的方式來傳遞數(shù)據(jù),這樣的方式跟以往在開發(fā) Web 應(yīng)用程序的時候是極其類似的;例如說在主要頁面中,筆者以下面的方式來呼叫 Navigate 方法
- private void btnUseUrl_Click(object sender, RoutedEventArgs e)
- {
- NavigationService.Navigate(new Uri("/Page_UseUrl.xaml?msg="+ textBox1.Text, UriKind.Relative));
- }
而在目標(biāo)頁面中,就可以利用 NavigationContext 來取值,例如
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- textBox1.Text = NavigationContext.QueryString["msg"];
- }
在小量的資料傳遞下,可以采用這種方式將資料傳遞到另一個頁面中。
利用 PhoneApplicationSerivce 中的 State 屬性
State 是一個實做 IDictionary 的類別,可以用來保存應(yīng)用程序的相關(guān)數(shù)據(jù);使用時感覺跟全局變量的方式有點類似,因為它也是在整個應(yīng)用程序中都可以去使用的;使用時要特別留意 Key 的命名,不能重復(fù)使用;而要使用時,必須要先引用 Microsoft.Phone.Shell 的命名空間,在 main page 的部分大概會利用像是下面這樣的方式來做使用
- private void btnUseState_Click(object sender, RoutedEventArgs e)
- {
- PhoneApplicationService.Current.State["msg"] = textBox1.Text;
- NavigationService.Navigate(new Uri("/Page_UseState.xaml", UriKind.Relative));
- }
而在目標(biāo)頁面中,取值得方式大致會像這個樣子
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- object data = null;
- if (PhoneApplicationService.Current.State.TryGetValue("msg", out data))
- textBox1.Text = (string)data;
- else
- textBox1.Text = "error";
- }
TryGetValue 是為了防止對應(yīng)的 Key 值不存在而使用的,或是您也可以利用 try…catch 來做,這個地方要記得要加上適當(dāng)?shù)腻e誤處理。而像是先前在 life cycle 中提到的部分,如果您是將值保存到 State 中,那么除非應(yīng)用程序結(jié)束,不然在 Deactivated、Activated 事件中,您還是可以去存取到相關(guān)的數(shù)據(jù)。
利用 Isolated storage
永久性的數(shù)據(jù)應(yīng)該使用隔離儲存區(qū)來儲存,以便下次程序開啟時能夠繼續(xù)的使用;還記得在前幾集討論過的隔離儲存區(qū)使用嗎?記得要引入相關(guān)的命名空間,筆者下面舉個簡單的例子;
- using System.IO.IsolatedStorage;
- using System.IO;
在寫入檔案部分的程序代碼大致會像下面這樣子
- private void btnUseStorage_Click(object sender, RoutedEventArgs e)
- {
- IsolatedStorageFile isofile = IsolatedStorageFile.GetUserStoreForApplication();
- if (isofile.FileExists("/data.txt"))
- isofile.DeleteFile("/data.txt");
- StreamWriter sw = new StreamWriter(isofile.CreateFile("/data.txt"), System.Text.Encoding.UTF8);
- sw.WriteLine("Some data from isolated storage");
- sw.Close();
- sw.Dispose();
- isofile.Dispose();
- NavigationService.Navigate(new Uri("/Page_UseStorage.xaml", UriKind.Relative));
- }
而讀取的部分,通常來說,使用隔離儲存區(qū)時可能會放置較多的數(shù)據(jù),所以筆者這邊在讀取時多建立一條線程來做讀取的動作,并且延遲 1500ms 來模擬這樣的效果,讀取動作的程序代碼大概會像這樣子
- namespace NavigateDemo
- {
- public partial class Page_UseStorage : PhoneApplicationPage
- {
- Thread Readthread = null;
- public Page_UseStorage()
- {
- InitializeComponent();
- }
- protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
- {
- base.OnNavigatedTo(e);
- //將progessbar設(shè)定為可見,並且將資料顯示部分設(shè)定為隱藏
- textBlock1.Visibility = System.Windows.Visibility.Collapsed;
- textBox1.Visibility = System.Windows.Visibility.Collapsed;
- progressBar1.Visibility = System.Windows.Visibility.Visible;
- //啟動執(zhí)行續(xù)作業(yè)
- Readthread = new Thread(ReadStorageFile);
- Readthread.Start();
- }
- private void ReadCompleted(string value)
- {
- progressBar1.Visibility = System.Windows.Visibility.Collapsed;
- textBlock1.Visibility = System.Windows.Visibility.Visible;
- textBox1.Visibility = System.Windows.Visibility.Visible;
- textBox1.Text = value;
- }
- //資料讀取完畢時,更新UI使用的委派事件
- delegate void deReadCompleted(string value);
- private void ReadStorageFile()
- {
- Thread.Sleep(11500);
- IsolatedStorageFile isofile = IsolatedStorageFile.GetUserStoreForApplication();
- if (isofile.FileExists("/data.txt"))
- {
- StreamReader sr = new StreamReader(isofile.OpenFile("/data.txt", FileMode.Open), System.Text.Encoding.UTF8);
- string tmpString = sr.ReadLine();
- sr.Close();
- sr.Dispose();
- this.Dispatcher.BeginInvoke(new deReadCompleted(ReadCompleted), new object[] { tmpString });
- }
- else
- {
- this.Dispatcher.BeginInvoke(new deReadCompleted(ReadCompleted), new object[] { "file not found.." });
- }
- isofile.Dispose();
- }
- }
- }
這邊在讀取時,利用 progessbar 來顯示正在讀取中的狀態(tài),畫面大致會像下面左圖,而讀取完畢時再將數(shù)據(jù)顯示在畫面上
Idle detection
最后我們來看 Idle detection 的部分;什么是 Idle detection 呢?這功能就是在設(shè)定系統(tǒng)閑置相關(guān)的偵測;例如說,如果裝置一段時間沒有使用(操作)的話,那么首先系統(tǒng)會將屏幕變暗,以節(jié)省電源,而再經(jīng)過一段時間之 后,便會鎖定裝置,將屏幕整個關(guān)閉,而這時候就會進(jìn)入了上面生命周期提到的 Deactivated 事件,之后應(yīng)用程序也進(jìn)入 tombstoning 的狀態(tài)。那么當(dāng)應(yīng)用程序是用于撥放音樂,當(dāng)裝置鎖定的情形下,我們?nèi)匀幌M麘?yīng)用程序可以繼續(xù)運作;或者應(yīng)用程序是利用裝置上的 sensor ( 例如 accelerometer ) 來進(jìn)行,在應(yīng)用程序執(zhí)行過程中,可能長時間都不會有使用觸控屏幕的情形,但這時候不希望系統(tǒng)進(jìn)入待機的狀態(tài),那么這時候就要設(shè)定 Idle detection 了。
在開始之前,要先提醒各位,在 Idle detection 的部分,MarketPlace 遞交應(yīng)用程序時是有一些規(guī)定的,請一定要確認(rèn) Windows Phone 7 Application Certification Requirements 中的相關(guān)規(guī)定,不然應(yīng)用程序是不能夠上架的。您可以在文件中的 6.3 節(jié)『 Applicatins Running under a Locked Screen 』中找到相關(guān)的資料。
好,了解該注意的事項之后,首先來看看偵測閑置的模式;在 Windows Phone 7 中,Idle detection 有兩種
ApplicationIdleDetectinMode
UserIdleDetectionMode
我們先來看 ApplicationIdleDetection 的部分;ApplicationIdleDetection 是應(yīng)用程序閑置狀態(tài)偵測,例如經(jīng)過一段時間沒有使用的話,裝置會進(jìn)入鎖定,并且引發(fā)應(yīng)用程序的 Deactivated 事件,隨后應(yīng)用程序進(jìn)入 tombstoning 狀態(tài);ApplicationIdleDetectionMode 便是設(shè)定裝置進(jìn)入鎖定時,應(yīng)用程序會不會進(jìn)入 tombstoning 狀態(tài),如果設(shè)定為關(guān)閉,那么將不會引發(fā)應(yīng)用程序的 Deacticated 事件,也不會將應(yīng)用程序進(jìn)入 tombstoning ;好處是甚么呢?大約有下列幾點
應(yīng)用程序仍然在執(zhí)行中
當(dāng)用戶返回應(yīng)用程序時,由于沒有進(jìn)入 tombstoning 的狀態(tài),能夠快速回復(fù)
而要注意的地方約略如下
應(yīng)用程序仍然在執(zhí)行,所以會繼續(xù)的消耗電池的電力;請?zhí)貏e注意,裝置同樣會進(jìn)入鎖定狀態(tài),只是應(yīng)用程序不會停止
所有有關(guān) UI 的更新動作應(yīng)該要停止,以節(jié)省電力的消耗
所有動畫、Timer 等動作應(yīng)該要停止
Sensor 將會停止回報(例如 accelerometer 將會停止回報目前的數(shù)值)
在改變閑置偵測模式時,永遠(yuǎn)要先詢問使用者是否同意
那么問題來了,要怎么去知道目前 ApplicationIdleDetectionMode 的狀態(tài),以及怎么知道目前裝置是不是要被鎖定了,進(jìn)而做相關(guān)的處理動作呢?
這里我們借用一下 MSDN 網(wǎng)站上的圖片來做說明
程序生命周期4
最外層的部分是 PhoneApplicationFrame ,裝載了整個應(yīng)用程序,包含 Page、Page 中顯示的內(nèi)容、 System tray(page 最上方顯示時間、訊號狀態(tài)的狀態(tài)欄)、 Application bar 等;在一個應(yīng)用程序中只會有一個 frame ,也是整個應(yīng)用程序最上層的容器;frame 會回報目前頁面的方向、目前可用(可供應(yīng)用程序使用)的空間有多少等等,以便讓各種應(yīng)用程序有相同的行為與特性,而 Obscured、UnObscured 事件,這兩個事件便是發(fā)生在 PhoneApplicationFrmae 中,接下來我們來看一下程序代碼的部分
- using Microsoft.Phone.Shell;
- Pprivate void SetAppIdleDetectionDisable()
- {
- //將應(yīng)用程式閒置狀態(tài)偵測關(guān)閉
- PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;
- PhoneApplicationFrame root = (App.Current.RootVisual) as PhoneApplicationFrame;
- if (root != null)
- {
- root.Obscured += new EventHandler(root_Obscured);
- root.Unobscured += new EventHandler(root_Unobscured);
- }
- else
- MessageBox.Show("Error");
- }
在程序代碼中可以看到,在把閑置狀態(tài)偵測關(guān)閉之后,接著就是取得 PhoneApplicationFrame ,而 PhoneApplicationFrame 時也是透過 App 類別來取得,取得之后由于在相關(guān)的事件必須要有對應(yīng)的處理動作,因此必須要掛載相關(guān)的事件;其中 Obscured 事件便是當(dāng)進(jìn)入鎖定時會引發(fā)的事件,在這個事件中,可以去做將 Storyboard、UI 的更新動作停止的相關(guān)動作,例如下面這邊以一個 Timer 為例子,在這個事件中會進(jìn)行關(guān)閉的動作
- void root_Obscured(object sender, ObscuredEventArgs e)
- {
- Debug.WriteLine("Unobscured");
- if (e.IsLocked)
- {
- //當(dāng)應(yīng)用程式被Lock screen覆蓋時要處理的動作,停止動畫(storyboard)、UI更新等動作
- timer.Stop();
- }
- }
這樣子就可以達(dá)到在裝置進(jìn)入鎖定時,能夠把一些不需要用到的部分關(guān)閉,以節(jié)省電力的使用。看完了關(guān)閉之后,那如果要重新把閑置狀態(tài)偵測給開啟呢?設(shè)定回 Enable 就可以了?這個動作沒有錯,但是目前的 Windows Phone 7 版本尚未支持,目前閑置模式關(guān)閉之后,要重新啟動唯一的方式就是整個應(yīng)用程序必須要重新開啟才行,這部分要特別留意。而 MSDN 中有提到,建議還是可以在應(yīng)用程序中加入相關(guān)的程序代碼,但同時要做錯誤處理,例如說
- private void SetAppIdleDetectionEnable()
- {
- if (PhoneApplicationService.Current.ApplicationIdleDetectionMode != IdleDetectionMode.Enabled)
- {
- try
- {
- PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Enabled;
- }
- catch (InvalidOperationException ex)
- {
- //platform not souported
- MessageBox.Show("Can't enable application idledection");
- }
- }
- }
這樣在未來的更新中,系統(tǒng)支持上來之后,你的應(yīng)用程序功能就可以立刻的正常運作了。
接下來來看 UserIdleDetectionMode 的部分,這個部分是偵測使用者閑置的狀態(tài),使用的方式跟剛剛 ApplicationIdleDetection 是極其類似的,主要的差異性筆者大致列一下
以目前來說,使用者閑置是指『當(dāng)用戶沒有觸碰屏幕操作,或是點選硬件按鍵時』,Sensor 的部分目前即使有改變(例如說轉(zhuǎn)向等等),也是視為閑置中,這個部分在未來的更新中可能會有變更
當(dāng)設(shè)定為 Disable 時,裝置永遠(yuǎn)不會進(jìn)入鎖定
UserIdleDetectionMode 是支持 Disable 以及 Enable 的
在關(guān)閉的時候,程序代碼的部分大致會像下面這樣
- private void SetUserIdleDetectionDisable()
- {
- PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
- }
跟先前操作 ApplicationIdleDetection 的部分幾乎是相同的,而重新啟動的部分也是相當(dāng)?shù)念愃?/p>
- private void SetUserIdleDetectionEnable()
- {
- if (PhoneApplicationService.Current.UserIdleDetectionMode != IdleDetectionMode.Enabled)
- {
- try
- {
- PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Enabled;
- }
- catch (Exception ex)
- {
- //platform not souported
- MessageBox.Show("Can't enable user idledection");
- }
- }
- }
這樣便可以達(dá)到停止閑置狀態(tài)的偵測,這對于一些單純利用 Sensor 來進(jìn)行操作的應(yīng)用程序是相當(dāng)有用的。