成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Windows Phone應(yīng)用程序生命周期

移動(dòng)開(kāi)發(fā)
由于在Windows Phone中,應(yīng)用程序的運(yùn)作方式跟以往的 Mobile 系列不同,所以在開(kāi)發(fā)應(yīng)用程序時(shí)要留意有關(guān)生命周期的事件,以便在需要的地方加以處理;事件的種類會(huì)有Launching、Closing、Activated、Deactivated,而這些事件是在甚么時(shí)候會(huì)發(fā)生呢?

前言

如果在以往,您有用過(guò)之前的 Mobile 操作系統(tǒng),像是 WM5.x、WM6.x ,是允許你在同時(shí)間執(zhí)行很多應(yīng)用程序;而應(yīng)用程序的默認(rèn)行為,在 Form 的右上角是一個(gè)『 X 』的按鈕,按鈕按下去之后,應(yīng)用程序是躲到了背景,仍在繼續(xù)在執(zhí)行;而到了Windows Phone 7,這樣的行為模式變更了,在前景一次只能執(zhí)行一個(gè)應(yīng)用程序,而原先的應(yīng)用程序發(fā)生了什么事?這就是本篇要跟各位介紹的;而第二個(gè)部分是在應(yīng)用程序中,可 能會(huì)存在好幾個(gè)頁(yè)面,而彼此間要怎么傳遞數(shù)據(jù)呢?

這都是今天會(huì)談?wù)摰降淖h題,那么接下來(lái)就開(kāi)始今天的介紹

議程

Application life cycle

Page Navigation

在頁(yè)面中傳遞數(shù)據(jù)

Idle detection

Application life cycle

由于在 Windows Phone 7 中,應(yīng)用程序的運(yùn)作方式跟以往的 Mobile 系列不同,所以在開(kāi)發(fā)應(yīng)用程序時(shí)要留意有關(guān)生命周期的事件,以便在需要的地方加以處理;事件的種類會(huì)有

Launching

Closing

Activated

Deactivated

而這些事件是在甚么時(shí)候會(huì)發(fā)生呢?下面先來(lái)看看第一種狀況

程序生命周期

程序生命周期

應(yīng)用程序『第一次的啟動(dòng)』一定是由首頁(yè)的 Tile 或是由應(yīng)用程序行表中啟動(dòng),而啟動(dòng)之后便會(huì)產(chǎn)生新的應(yīng)用程序?qū)嵗又蜁?huì)進(jìn)入到 Launching 事件中;在 Launching 事件中您可以做一些初始化的動(dòng)作,需要特別注意的是在 Launching 事件中, 不適合去做長(zhǎng)時(shí)間的動(dòng)作,因?yàn)?Launching 事件是發(fā)生在頁(yè)面顯示之前,所以在Launching 事件沒(méi)有完成之前,頁(yè)面都是看不到的,整個(gè)屏幕都會(huì)是黑黑的一片,所以執(zhí)行長(zhǎng)時(shí)間的作業(yè)的話,是很容易被誤認(rèn)為應(yīng)用程序停止響應(yīng)或是其他的異常情形,這是 不好的。

經(jīng)過(guò)Launching 的事件之后,應(yīng)用程序的第一個(gè)頁(yè)面就會(huì)顯示出來(lái),這時(shí)候會(huì)進(jìn)入到應(yīng)用程序執(zhí)行中 ( Running ) 的狀態(tài),而在應(yīng)用程序的第一個(gè)頁(yè)面時(shí),如果使用者按下返回鍵,這個(gè)時(shí)候就會(huì)直接引發(fā) Closing 的事件,Closing 事件之后就會(huì)把應(yīng)用程序整個(gè)關(guān)閉了。

那么,如果在應(yīng)用程序的第一個(gè)頁(yè)面中,使用者按下了開(kāi)始鈕 ( ) ,那這時(shí)候呢?關(guān)閉應(yīng)用程序嗎?不,這時(shí)候應(yīng)用程序會(huì)進(jìn)入tombstoning,之后移到背景,讓我們來(lái)看看下一張圖

程序生命周期2

程序生命周期2

當(dāng)在第一個(gè)頁(yè)面中,使用者按下開(kāi)始鈕,這個(gè)時(shí)候應(yīng)用程序便會(huì)進(jìn)入 Deactivated 的事件,之后便進(jìn)入 tombstoning 的狀態(tài),也就是整個(gè)應(yīng)用程序會(huì)停止運(yùn)作,這跟之前的 Mobile 5.x/6.x 是有很大的不同的。而在 Deactivated 事件之后,使用者這時(shí)候可能會(huì)執(zhí)行其他的應(yīng)用程序或進(jìn)行其他的操作,之后可能會(huì)按下返回鍵回到應(yīng)用程序的執(zhí)行,這個(gè)時(shí)候就會(huì)進(jìn)入 Activated 事件, Activated 事件處理完畢之后,便會(huì)回到執(zhí)行中的狀態(tài);那在這兩個(gè)事件中,要處理甚么呢?您可以在這個(gè)事件中去儲(chǔ)存一些暫時(shí)性的數(shù)據(jù),而這些數(shù)據(jù)同時(shí)又是屬于整個(gè)應(yīng)用 程序會(huì)使用到的,就可以在這些事件中去處理。

Deactivated 事件還有個(gè)地方需特別注意,所有在 Deactivated 事件中處理的事情,必需要在 10 秒鐘之內(nèi)處理完畢,不然的話系統(tǒng)會(huì)強(qiáng)制的中止你的應(yīng)用程序,而假設(shè)發(fā)生這種狀況的話,程序是被整個(gè)關(guān)閉,按下返回鍵是不會(huì)回到應(yīng)用程序中的,這點(diǎn)必須特別 留意。

舉個(gè)簡(jiǎn)單的例子,例如說(shuō)一個(gè)很簡(jiǎn)單的游戲程序,程序中會(huì)有總分?jǐn)?shù)的紀(jì)錄,像是下面左圖樣子,現(xiàn)在是 50 分,那如果不小心按到開(kāi)始鈕或是其他的原因,離開(kāi)了應(yīng)用程序,再返回的時(shí)候,糟糕..這時(shí)候會(huì)像下面右圖一樣,變成 0 分了;如果沒(méi)有適當(dāng)?shù)娜ヌ幚磉@個(gè)部份,那對(duì)使用者來(lái)說(shuō)是會(huì)覺(jué)得很疑惑,而且不是一個(gè)好的應(yīng)用程序的。

程序生命周期3

程序生命周期3

這個(gè)時(shí)候就可以處理 Deactivated、Activated 事件,在相關(guān)的事件中去做儲(chǔ)存的事件,舉個(gè)簡(jiǎn)單的例子;筆者首先在 App.xaml.cs 中加入一個(gè) HighScore 的全局變量

public static int HighScore;

之后在 App.xaml.cs 中處理相關(guān)的事件 ( Application life cycle 相關(guān)的事件在 App.xaml.cs 中都可以找到 )

  1. // Code to execute when the application is activated (brought to foreground) 
  2. // This code will not execute when the application is first launched 
  3. private void Application_Activated(object sender, ActivatedEventArgs e) 
  4. object tmp = 0; 
  5. if (PhoneApplicationService.Current.State.TryGetValue("Score"out tmp)) 
  6. App.HighScore = (int)tmp; 
  7. else 
  8. App.HighScore = 0; 
  9.  
  10.  
  11. // Code to execute when the application is deactivated (sent to background) 
  12. // This code will not execute when the application is closing 
  13. private void Application_Deactivated(object sender, DeactivatedEventArgs e) 
  14. PhoneApplicationService.Current.State["Score"] = App.HighScore; 
  15. }  

最后,在 MainPage.xaml.cs 中,Loaded 事件中,把值給讀出來(lái)顯示

  1. private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e) 
  2. tbScore.Text = App.HighScore.ToString(); 
  3. }  

這樣子,不管是不小心誤觸到其他按鍵或者是其他原因離開(kāi)了應(yīng)用程序都可以正常的保留住想要保留的數(shù)據(jù)了。

而在上面的程序代碼中,您會(huì)看到 PhoneApplicationService.Curent.State ,這是一個(gè)實(shí)做 IDictionary 的類別,使用時(shí)要加入 Microsoft.Phone.Shell 的命名空間,之后就可以它用來(lái)儲(chǔ)存一些應(yīng)用程序中的數(shù)據(jù)。

注:應(yīng)用程序執(zhí)行中,用戶按下開(kāi)始鈕,或是執(zhí)行 Lanucher/Chooser 、拍照等等,或是一段時(shí)間沒(méi)有使用而進(jìn)入鎖定;只要是離開(kāi)應(yīng)用程序本身,就會(huì)開(kāi)始進(jìn)入 Deactivated 事件

Page Navigation

在剛剛我們看過(guò)了應(yīng)用程序的生命周期,那么頁(yè)面呢?緊接著就來(lái)看看在頁(yè)面顯示的過(guò)程中,以及在頁(yè)面中去巡覽的時(shí)候,應(yīng)用程序是如何處理這些事件的;在這邊需要注意的是件有

Loaded

每一次頁(yè)面的載入完成時(shí),都會(huì)引發(fā) Loaded 事件

Unloaded

當(dāng)從這個(gè)頁(yè)面要巡覽到另外一個(gè)頁(yè)面時(shí),就會(huì)引發(fā) Unload 事件

OnNavigatedFrom

當(dāng)利用 NavigationService ,要從頁(yè)面離開(kāi)時(shí)會(huì)引發(fā) OnNavigatedForm 事件,使用時(shí)必須要覆寫 Page 事件

OnNavigatedTo

當(dāng)利用 NavigationService ,尋覽到新的頁(yè)面時(shí),會(huì)引發(fā)新頁(yè)面的 OnNavigatedTo 事件,使用時(shí)必須要覆寫 Page 事件

其中如果要處理 OnNavigatedTo、OnNavigatedForm 事件是必須利用覆寫的方式來(lái)使用,而事件發(fā)生的順序會(huì)是 OnNavigatedTo à Load à OnNavigatedForm à UnLoaded。

而在 Page 的這些事件中,要處理甚么動(dòng)作呢?在頁(yè)面相關(guān)的事件中,要處理的是必須要儲(chǔ)存一些暫時(shí)性的數(shù)據(jù),以便在巡覽的過(guò)程中使用;以及在頁(yè)面中傳遞數(shù)據(jù)等動(dòng)作。當(dāng)要進(jìn)行頁(yè)面的巡覽動(dòng)作,通常會(huì)利用 NavigationService 來(lái)做,例如

  1. NavigationService.Navigate(new Uri("/ThirdPage.xaml"
  2. UriKind.Relative));  

利用這個(gè)方式就可以巡覽到下一個(gè)頁(yè)面,那退回上一個(gè)頁(yè)面呢?這時(shí)候可以利用 GoBack 的方式來(lái)返回,例如

  1. NavigationService.GoBack();  

那如果不用 GoBack 的方式,直接也利用 Navigate 的方式指定頁(yè)面名稱呢?當(dāng)然也是可以巡覽到指定的頁(yè)面,但是要注意的是,利用 Navigate 方法時(shí),是會(huì)產(chǎn)生一個(gè)『新』的目標(biāo)頁(yè)面的,這是兩個(gè)方式不同的地方;舉個(gè)簡(jiǎn)單的例子來(lái)說(shuō);假設(shè)在 MainPage 當(dāng)中,擺放了一個(gè) TextBox ,輸入一些文字之后,巡覽到 SecondPage ;這時(shí)候如果使用 GoBack 的方式(或是按下硬件的返回鍵),您會(huì)發(fā)現(xiàn) TextBox 會(huì)記住剛剛輸入的文字,而如果是用 Navigate 加上指定頁(yè)面的方式,您會(huì)發(fā)現(xiàn) TextBox 的文字會(huì)是默認(rèn)的初始設(shè)定,而不會(huì)是剛剛輸入的文字。

到這里,相信您對(duì)于頁(yè)面以及應(yīng)用程序的生命周期有大略的認(rèn)識(shí)與了解,而在這些事件 中,最常需要處理的就是去保存應(yīng)用程序相關(guān)的狀態(tài);主要在 Deactivated 以及 Activated 這類事件中處理的是整個(gè)應(yīng)用程序通用性的數(shù)據(jù)或是狀態(tài);而 OnNavigateTo 這類事件中則是處理頁(yè)面使用的暫時(shí)數(shù)據(jù)或是處理其他傳遞過(guò)來(lái)的數(shù)據(jù),接下來(lái)就來(lái)看一下,在各個(gè)頁(yè)面中傳遞數(shù)據(jù)是用什么方式進(jìn)行,以及如何去保存一些應(yīng)用程 序的狀態(tài)。

在頁(yè)面中傳遞數(shù)據(jù)

傳遞數(shù)據(jù)數(shù)據(jù)的方式有很多種,可以依照不同的狀況去使用,下面筆者大致列出幾種方式,您可以依照使用的情境以及需求做調(diào)整

利用全局變量的方式

自行宣告全局變量或是在 App 類別中 ( App.xaml.cs ) ,去建立相關(guān)的屬性 ( property ) 或是字段 ( flied )

例如說(shuō),筆者在 App.xaml.cs 中去新增一個(gè)字符串變量,大概像這個(gè)樣子

  1. public static string SharedString = "";  

之后在主要頁(yè)面 ( main page ) 中,就可以利用下面的方式來(lái)儲(chǔ)存要傳遞的數(shù)據(jù)

  1. App.SharedString = textBox1.Text; 
  2. NavigationService.Navigate(new Uri("/Page_UseApp.xaml"
  3. UriKind.Relative));  

而接著在新的頁(yè)面中,就可以在 OnNavigateTo 的事件中去取值,并且把值顯示出來(lái),例如

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
  2. base.OnNavigatedTo(e); 
  3. textBox1.Text = App.SharedString; 
  4. }  

筆者這邊是利用簡(jiǎn)單的字符串變量來(lái)做示范,實(shí)際使用時(shí)您也可以用自定義類別或是其他的數(shù)據(jù)類型來(lái)使用,這就看您實(shí)際的需求;而在 App 類別中的相關(guān)數(shù)據(jù)是整個(gè)應(yīng)用程序都可以共享的。

利用 Url 參數(shù)傳遞

利用像是 SecondPage.xaml?para1=12345¶2=aaaaa 的方式來(lái)傳遞數(shù)據(jù),這樣的方式跟以往在開(kāi)發(fā) Web 應(yīng)用程序的時(shí)候是極其類似的;例如說(shuō)在主要頁(yè)面中,筆者以下面的方式來(lái)呼叫 Navigate 方法

  1. private void btnUseUrl_Click(object sender, RoutedEventArgs e) 
  2. NavigationService.Navigate(new Uri("/Page_UseUrl.xaml?msg="+ textBox1.Text, UriKind.Relative)); 
  3. }  

而在目標(biāo)頁(yè)面中,就可以利用 NavigationContext 來(lái)取值,例如

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
  2. base.OnNavigatedTo(e); 
  3. textBox1.Text = NavigationContext.QueryString["msg"]; 
  4. }  

在小量的資料傳遞下,可以采用這種方式將資料傳遞到另一個(gè)頁(yè)面中。

利用 PhoneApplicationSerivce 中的 State 屬性

State 是一個(gè)實(shí)做 IDictionary 的類別,可以用來(lái)保存應(yīng)用程序的相關(guān)數(shù)據(jù);使用時(shí)感覺(jué)跟全局變量的方式有點(diǎn)類似,因?yàn)樗彩窃谡麄€(gè)應(yīng)用程序中都可以去使用的;使用時(shí)要特別留意 Key 的命名,不能重復(fù)使用;而要使用時(shí),必須要先引用 Microsoft.Phone.Shell 的命名空間,在 main page 的部分大概會(huì)利用像是下面這樣的方式來(lái)做使用

  1. private void btnUseState_Click(object sender, RoutedEventArgs e) 
  2. PhoneApplicationService.Current.State["msg"] = textBox1.Text; 
  3. NavigationService.Navigate(new Uri("/Page_UseState.xaml", UriKind.Relative)); 
  4. }  

而在目標(biāo)頁(yè)面中,取值得方式大致會(huì)像這個(gè)樣子

  1. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
  2. base.OnNavigatedTo(e); 
  3. object data = null
  4. if (PhoneApplicationService.Current.State.TryGetValue("msg"out data)) 
  5. textBox1.Text = (string)data; 
  6. else 
  7. textBox1.Text = "error"
  8. }  

TryGetValue 是為了防止對(duì)應(yīng)的 Key 值不存在而使用的,或是您也可以利用 try…catch 來(lái)做,這個(gè)地方要記得要加上適當(dāng)?shù)腻e(cuò)誤處理。而像是先前在 life cycle 中提到的部分,如果您是將值保存到 State 中,那么除非應(yīng)用程序結(jié)束,不然在 Deactivated、Activated 事件中,您還是可以去存取到相關(guān)的數(shù)據(jù)。

利用 Isolated storage

永久性的數(shù)據(jù)應(yīng)該使用隔離儲(chǔ)存區(qū)來(lái)儲(chǔ)存,以便下次程序開(kāi)啟時(shí)能夠繼續(xù)的使用;還記得在前幾集討論過(guò)的隔離儲(chǔ)存區(qū)使用嗎?記得要引入相關(guān)的命名空間,筆者下面舉個(gè)簡(jiǎn)單的例子;

  1. using System.IO.IsolatedStorage; 
  2. using System.IO;  

在寫入檔案部分的程序代碼大致會(huì)像下面這樣子

  1. private void btnUseStorage_Click(object sender, RoutedEventArgs e) 
  2. IsolatedStorageFile isofile = IsolatedStorageFile.GetUserStoreForApplication(); 
  3. if (isofile.FileExists("/data.txt")) 
  4. isofile.DeleteFile("/data.txt"); 
  5. StreamWriter sw = new StreamWriter(isofile.CreateFile("/data.txt"), System.Text.Encoding.UTF8); 
  6. sw.WriteLine("Some data from isolated storage"); 
  7. sw.Close(); 
  8. sw.Dispose(); 
  9. isofile.Dispose(); 
  10.  
  11. NavigationService.Navigate(new Uri("/Page_UseStorage.xaml", UriKind.Relative)); 
  12. }  

而讀取的部分,通常來(lái)說(shuō),使用隔離儲(chǔ)存區(qū)時(shí)可能會(huì)放置較多的數(shù)據(jù),所以筆者這邊在讀取時(shí)多建立一條線程來(lái)做讀取的動(dòng)作,并且延遲 1500ms 來(lái)模擬這樣的效果,讀取動(dòng)作的程序代碼大概會(huì)像這樣子

  1. namespace NavigateDemo 
  2. public partial class Page_UseStorage : PhoneApplicationPage 
  3. Thread Readthread = null
  4.  
  5. public Page_UseStorage() 
  6. InitializeComponent(); 
  7.  
  8. protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
  9. base.OnNavigatedTo(e); 
  10. //將progessbar設(shè)定為可見(jiàn),並且將資料顯示部分設(shè)定為隱藏 
  11. textBlock1.Visibility = System.Windows.Visibility.Collapsed; 
  12. textBox1.Visibility = System.Windows.Visibility.Collapsed; 
  13. progressBar1.Visibility = System.Windows.Visibility.Visible; 
  14. //啟動(dòng)執(zhí)行續(xù)作業(yè) 
  15. Readthread = new Thread(ReadStorageFile); 
  16. Readthread.Start(); 
  17.  
  18. private void ReadCompleted(string value) 
  19. progressBar1.Visibility = System.Windows.Visibility.Collapsed; 
  20. textBlock1.Visibility = System.Windows.Visibility.Visible; 
  21. textBox1.Visibility = System.Windows.Visibility.Visible; 
  22. textBox1.Text = value; 
  23.  
  24. //資料讀取完畢時(shí),更新UI使用的委派事件 
  25. delegate void deReadCompleted(string value); 
  26. private void ReadStorageFile() 
  27. Thread.Sleep(11500); 
  28. IsolatedStorageFile isofile = IsolatedStorageFile.GetUserStoreForApplication(); 
  29. if (isofile.FileExists("/data.txt")) 
  30. StreamReader sr = new StreamReader(isofile.OpenFile("/data.txt", FileMode.Open), System.Text.Encoding.UTF8); 
  31. string tmpString = sr.ReadLine(); 
  32. sr.Close(); 
  33. sr.Dispose(); 
  34. this.Dispatcher.BeginInvoke(new deReadCompleted(ReadCompleted), new object[] { tmpString }); 
  35. else 
  36. this.Dispatcher.BeginInvoke(new deReadCompleted(ReadCompleted), new object[] { "file not found.." }); 
  37. isofile.Dispose(); 
  38. }  

這邊在讀取時(shí),利用 progessbar 來(lái)顯示正在讀取中的狀態(tài),畫面大致會(huì)像下面左圖,而讀取完畢時(shí)再將數(shù)據(jù)顯示在畫面上

Idle detection

最后我們來(lái)看 Idle detection 的部分;什么是 Idle detection 呢?這功能就是在設(shè)定系統(tǒng)閑置相關(guān)的偵測(cè);例如說(shuō),如果裝置一段時(shí)間沒(méi)有使用(操作)的話,那么首先系統(tǒng)會(huì)將屏幕變暗,以節(jié)省電源,而再經(jīng)過(guò)一段時(shí)間之 后,便會(huì)鎖定裝置,將屏幕整個(gè)關(guān)閉,而這時(shí)候就會(huì)進(jìn)入了上面生命周期提到的 Deactivated 事件,之后應(yīng)用程序也進(jìn)入 tombstoning 的狀態(tài)。那么當(dāng)應(yīng)用程序是用于撥放音樂(lè),當(dāng)裝置鎖定的情形下,我們?nèi)匀幌M麘?yīng)用程序可以繼續(xù)運(yùn)作;或者應(yīng)用程序是利用裝置上的 sensor ( 例如 accelerometer ) 來(lái)進(jìn)行,在應(yīng)用程序執(zhí)行過(guò)程中,可能長(zhǎng)時(shí)間都不會(huì)有使用觸控屏幕的情形,但這時(shí)候不希望系統(tǒng)進(jìn)入待機(jī)的狀態(tài),那么這時(shí)候就要設(shè)定 Idle detection 了。

在開(kāi)始之前,要先提醒各位,在 Idle detection 的部分,MarketPlace 遞交應(yīng)用程序時(shí)是有一些規(guī)定的,請(qǐng)一定要確認(rèn) Windows Phone 7 Application Certification Requirements 中的相關(guān)規(guī)定,不然應(yīng)用程序是不能夠上架的。您可以在文件中的 6.3 節(jié)『 Applicatins Running under a Locked Screen 』中找到相關(guān)的資料。

好,了解該注意的事項(xiàng)之后,首先來(lái)看看偵測(cè)閑置的模式;在 Windows Phone 7 中,Idle detection 有兩種

ApplicationIdleDetectinMode

UserIdleDetectionMode

我們先來(lái)看 ApplicationIdleDetection 的部分;ApplicationIdleDetection 是應(yīng)用程序閑置狀態(tài)偵測(cè),例如經(jīng)過(guò)一段時(shí)間沒(méi)有使用的話,裝置會(huì)進(jìn)入鎖定,并且引發(fā)應(yīng)用程序的 Deactivated 事件,隨后應(yīng)用程序進(jìn)入 tombstoning 狀態(tài);ApplicationIdleDetectionMode 便是設(shè)定裝置進(jìn)入鎖定時(shí),應(yīng)用程序會(huì)不會(huì)進(jìn)入 tombstoning 狀態(tài),如果設(shè)定為關(guān)閉,那么將不會(huì)引發(fā)應(yīng)用程序的 Deacticated 事件,也不會(huì)將應(yīng)用程序進(jìn)入 tombstoning ;好處是甚么呢?大約有下列幾點(diǎn)

應(yīng)用程序仍然在執(zhí)行中

當(dāng)用戶返回應(yīng)用程序時(shí),由于沒(méi)有進(jìn)入 tombstoning 的狀態(tài),能夠快速回復(fù)

而要注意的地方約略如下

應(yīng)用程序仍然在執(zhí)行,所以會(huì)繼續(xù)的消耗電池的電力;請(qǐng)?zhí)貏e注意,裝置同樣會(huì)進(jìn)入鎖定狀態(tài),只是應(yīng)用程序不會(huì)停止

所有有關(guān) UI 的更新動(dòng)作應(yīng)該要停止,以節(jié)省電力的消耗

所有動(dòng)畫、Timer 等動(dòng)作應(yīng)該要停止

Sensor 將會(huì)停止回報(bào)(例如 accelerometer 將會(huì)停止回報(bào)目前的數(shù)值)

在改變閑置偵測(cè)模式時(shí),永遠(yuǎn)要先詢問(wèn)使用者是否同意

那么問(wèn)題來(lái)了,要怎么去知道目前 ApplicationIdleDetectionMode 的狀態(tài),以及怎么知道目前裝置是不是要被鎖定了,進(jìn)而做相關(guān)的處理動(dòng)作呢?

這里我們借用一下 MSDN 網(wǎng)站上的圖片來(lái)做說(shuō)明

程序生命周期4

程序生命周期4

最外層的部分是 PhoneApplicationFrame ,裝載了整個(gè)應(yīng)用程序,包含 Page、Page 中顯示的內(nèi)容、 System tray(page 最上方顯示時(shí)間、訊號(hào)狀態(tài)的狀態(tài)欄)、 Application bar 等;在一個(gè)應(yīng)用程序中只會(huì)有一個(gè) frame ,也是整個(gè)應(yīng)用程序最上層的容器;frame 會(huì)回報(bào)目前頁(yè)面的方向、目前可用(可供應(yīng)用程序使用)的空間有多少等等,以便讓各種應(yīng)用程序有相同的行為與特性,而 Obscured、UnObscured 事件,這兩個(gè)事件便是發(fā)生在 PhoneApplicationFrmae 中,接下來(lái)我們來(lái)看一下程序代碼的部分

  1. using Microsoft.Phone.Shell; 
  2. Pprivate void SetAppIdleDetectionDisable() 
  3. //將應(yīng)用程式閒置狀態(tài)偵測(cè)關(guān)閉 
  4. PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled; 
  5. PhoneApplicationFrame root = (App.Current.RootVisual) as PhoneApplicationFrame; 
  6. if (root != null
  7. root.Obscured += new EventHandler(root_Obscured); 
  8. root.Unobscured += new EventHandler(root_Unobscured); 
  9. else 
  10. MessageBox.Show("Error"); 
  11. }  

在程序代碼中可以看到,在把閑置狀態(tài)偵測(cè)關(guān)閉之后,接著就是取得 PhoneApplicationFrame ,而 PhoneApplicationFrame 時(shí)也是透過(guò) App 類別來(lái)取得,取得之后由于在相關(guān)的事件必須要有對(duì)應(yīng)的處理動(dòng)作,因此必須要掛載相關(guān)的事件;其中 Obscured 事件便是當(dāng)進(jìn)入鎖定時(shí)會(huì)引發(fā)的事件,在這個(gè)事件中,可以去做將 Storyboard、UI 的更新動(dòng)作停止的相關(guān)動(dòng)作,例如下面這邊以一個(gè) Timer 為例子,在這個(gè)事件中會(huì)進(jìn)行關(guān)閉的動(dòng)作

  1. void root_Obscured(object sender, ObscuredEventArgs e) 
  2. Debug.WriteLine("Unobscured"); 
  3. if (e.IsLocked) 
  4. //當(dāng)應(yīng)用程式被Lock screen覆蓋時(shí)要處理的動(dòng)作,停止動(dòng)畫(storyboard)、UI更新等動(dòng)作 
  5. timer.Stop(); 
  6. }  

這樣子就可以達(dá)到在裝置進(jìn)入鎖定時(shí),能夠把一些不需要用到的部分關(guān)閉,以節(jié)省電力的使用。看完了關(guān)閉之后,那如果要重新把閑置狀態(tài)偵測(cè)給開(kāi)啟呢?設(shè)定回 Enable 就可以了?這個(gè)動(dòng)作沒(méi)有錯(cuò),但是目前的 Windows Phone 7 版本尚未支持,目前閑置模式關(guān)閉之后,要重新啟動(dòng)唯一的方式就是整個(gè)應(yīng)用程序必須要重新開(kāi)啟才行,這部分要特別留意。而 MSDN 中有提到,建議還是可以在應(yīng)用程序中加入相關(guān)的程序代碼,但同時(shí)要做錯(cuò)誤處理,例如說(shuō)

  1. private void SetAppIdleDetectionEnable() 
  2. if (PhoneApplicationService.Current.ApplicationIdleDetectionMode != IdleDetectionMode.Enabled) 
  3. try 
  4. PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Enabled; 
  5. catch (InvalidOperationException ex) 
  6. //platform not souported 
  7. MessageBox.Show("Can't enable application idledection"); 
  8. }  

這樣在未來(lái)的更新中,系統(tǒng)支持上來(lái)之后,你的應(yīng)用程序功能就可以立刻的正常運(yùn)作了。

接下來(lái)來(lái)看 UserIdleDetectionMode 的部分,這個(gè)部分是偵測(cè)使用者閑置的狀態(tài),使用的方式跟剛剛 ApplicationIdleDetection 是極其類似的,主要的差異性筆者大致列一下

以目前來(lái)說(shuō),使用者閑置是指『當(dāng)用戶沒(méi)有觸碰屏幕操作,或是點(diǎn)選硬件按鍵時(shí)』,Sensor 的部分目前即使有改變(例如說(shuō)轉(zhuǎn)向等等),也是視為閑置中,這個(gè)部分在未來(lái)的更新中可能會(huì)有變更

當(dāng)設(shè)定為 Disable 時(shí),裝置永遠(yuǎn)不會(huì)進(jìn)入鎖定

UserIdleDetectionMode 是支持 Disable 以及 Enable 的

在關(guān)閉的時(shí)候,程序代碼的部分大致會(huì)像下面這樣

  1. private void SetUserIdleDetectionDisable() 
  2. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; 
  3. }  

跟先前操作 ApplicationIdleDetection 的部分幾乎是相同的,而重新啟動(dòng)的部分也是相當(dāng)?shù)念愃?/p>

  1. private void SetUserIdleDetectionEnable() 
  2. if (PhoneApplicationService.Current.UserIdleDetectionMode != IdleDetectionMode.Enabled) 
  3. try 
  4. PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Enabled; 
  5. catch (Exception ex) 
  6. //platform not souported 
  7. MessageBox.Show("Can't enable user idledection"); 
  8. }  

這樣便可以達(dá)到停止閑置狀態(tài)的偵測(cè),這對(duì)于一些單純利用 Sensor 來(lái)進(jìn)行操作的應(yīng)用程序是相當(dāng)有用的。

責(zé)任編輯:閆佳明 來(lái)源: wpdever
相關(guān)推薦

2012-05-28 15:37:20

WP程序生命周期

2014-07-16 13:39:30

Windows Pho

2009-06-24 10:34:39

JSF生命周期JSF應(yīng)用程序

2011-07-20 15:58:58

iPhone 應(yīng)用程序 生命周期

2015-07-09 15:42:48

ios應(yīng)用生命周期

2013-09-26 11:20:34

Informatica

2011-08-10 16:50:10

iPhone生命周期

2014-07-11 11:09:10

App應(yīng)用程序生命周期

2014-02-24 10:50:32

DevOps云應(yīng)用

2023-12-21 08:00:00

ChatGPT人工智能大型語(yǔ)言模型

2012-08-16 09:38:38

ASP.NET

2014-09-28 11:28:02

Android應(yīng)用程序生命周期

2010-08-01 15:29:04

AndroidDalvik

2025-04-28 01:22:00

2010-04-02 09:02:02

ASP.NET MVC

2013-07-30 13:38:27

Windows PhoWindows Pho

2012-06-20 10:29:16

敏捷開(kāi)發(fā)

2011-10-25 10:24:03

Windows Pho

2010-11-03 15:10:04

SilverlightSilverlightWindows Pho

2011-03-21 09:05:40

IronRubyWindows Pho
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美一区二区三区在线播放 | 麻豆一区二区三区 | 成人在线免费观看av | 欧美一a一片一级一片 | 中文字幕精品视频在线观看 | 一区二区电影网 | 成人天堂噜噜噜 | 日日爽 | 国产成人精品综合 | 中文字幕av网站 | 免费在线看黄 | 久久精品中文字幕 | 欧美一卡二卡在线观看 | 亚洲国产精品一区二区三区 | 国产午夜精品视频 | 精品中文字幕在线观看 | 亚洲一区二区三区视频 | 欧美自拍网站 | 99精品电影 | 亚洲一区精品在线 | 中文字幕一区二区三区日韩精品 | 香蕉视频久久久 | 国产成人精品免费视频 | 亚洲香蕉| xxx视频| 日韩成人在线免费观看 | 亚洲一区 | 中文字幕在线观看国产 | 国产精品精品久久久 | 午夜精品久久久久久不卡欧美一级 | 欧美亚洲视频在线观看 | 日韩午夜精品 | 亚洲色图综合 | 精品欧美一区免费观看α√ | 欧美成视频 | 一区二区三区视频在线观看 | 91免费福利在线 | 日韩中文字幕 | 亚洲精品久久区二区三区蜜桃臀 | 久久99国产精品 | 亚洲1区|