Windows Phone 8開發入門(六)



主要內容:後臺代理

後退堆棧

操作返回堆棧

Private void PurgeBackStackButton_Click(object sender,RoutedEventArgs e)

{

WhileNavigationService.CanGoBack)

NavigationService.RemoveBackEntry();

}

RemoveBackEntry方法用於從後退堆棧中移除最近的條目,如果沒有要移除的條目,則引發InvalidOperationException.如果您想移除多個項目,則多次調用此方法。此API是同步的,因此必須從UI線程調用。

使用後退堆棧

使用新頁面替換當前頁面

刪除所有頁面

清除整個頁面後退堆棧並替換爲給定頁面。

 

前臺任務

一般Windows phone應用程序是運行在“前臺”

任何時間只能有一個應用運允許運行在前臺

目的是保證最佳的用戶體驗和延長手機電量使用時長

 

後臺代理

後臺代理

Windows Phone應用程序可啓動一個後臺代理爲其服務

可以定期代理或者資源密集型代理

每一個應用程序只允許使用一個代理

後臺代理都允許應用程序在後臺執行代碼,即使當應用程序未在前臺運行時也是如此

不同類型的計劃任務是針對不同類型的後臺處理方案設計的,具有不同的行爲和限制

後臺代理使用警告

Windows Phone操作系統限制了同時激活的代理的數量

除非在適當的條件下調用,否則代理可能不會啓用

後臺代理只在操作系統認爲資源足夠時,方可運行

如果手機處於節電模式狀態下,那麼所有的後臺代理將被終止

用戶可以管理其手機上的每個應用的後臺代理,選擇啓用或者禁用

代理和任務

不同類型的計劃任務是針對不同類型的後臺處理方案設計的,因此具有不同的行爲和限制

兩種類型的任務

Priodic tasks定期代理

Resource intensive tasks資源密集型代理

代理的代碼由應用程序在從BackgroundAgent繼承的類中實現。代理啓動時,操作系統調用OnInvoke(ScheduledTask).在該方法中,應用程序可以確定它以哪種ScheduleTask類型運行,並執行相應的操作。

定期代理(PeriodicTask Agents)

定期代理通常每隔30分鐘運行一次。若要優化電池使用時間,定期代理的運行可以與其他後臺進程一致,因此執行時間可能最多漂移10分鐘

定期代理通常運行25秒。其他限制可能會導致嗲了提取終止。

節電模式是一個選項,用戶可以在設備上啓用該選項以指示應該優先考慮電池使用時間。如果啓用此模式,則定期代理可能不運行,即使間隔已過也是如此。

爲了幫助最大程度地提高設備的電池使用時間,對手機上可以計劃的定期代理數量進行了硬性限制。它因每個設備配置而異並且可以低到6.還有另一個低於硬性限制的限制,超過該限制之後會警告用戶他們正在運行多個後臺代理,因此電池消耗可能比較快。

資源密集型代理(ResourceIntensive Agents)

資源密集型代理通常運行10分鐘。其他限制可能會導致代理提取終止。

除非設備連接到外部電源,否則不運行資源密集型代理。

除非設備通過Wi-FiPC連接建立網絡連接,否則資源密集型代理不運行。

除非設備的電池電量高於90%,否則資源密集型代理不運行

除非設備屏幕鎖定,否則資源密集型代理不運行

當手機呼叫處於活動狀態時,資源密集型代理不運行

不能將網絡更改爲手機網絡,即如果資源密集型代理嘗試調用指定MobileBroadbandGSM()MobileBroadbandCDMA()AssociateToNetworkInterface(Socket,NetworkInterfaceinfo),則該方法調用失敗。

後臺代理功能

允許

Tiles

Toast

Location

Network

R/W ISO store

Sockets

限制

Display UI

XNA libraries

Microphone and camera

Sensors

Play audio(may only use background audio APIs)

在後臺運行Windows Phone 8的位置跟蹤

Windows Phone 8上,在用戶導航離開之後,只要位置跟蹤應用持續活躍地跟蹤位置,它就可以持續在後臺運行

此功能支持諸如提供逐嚮導航的應用這樣的方案

對於在移動設備上運行的應用,耗電量是一個重要注意事項。在後臺運行應用時,您可以採取一些步驟降低電池消耗,進而提高用戶對應用的滿意度

創建後臺代理

Add new project-->Windows Phone -->Windows PhoneSecheduled Task Agent-->創建LocationLogTaskAgent工程

Captions Log Solution

解決方案中包含兩個工程

LocationLogger:Windows Phone工程---啓動程序所在的工程

LocationLogTaskAgent:位置跟蹤的後臺代理工程

解決方案中可包含多個不同類型的工程

連接後臺代碼的工程

CaptainLog工程引用了後臺代理LocationTaskAgent工程

前臺的應用不會直接在代碼中引用dialing的類

然而,我們必須明確的連接兩個應用,爲此在CaptainsLog工程引用LocationTaskAgent的輸出

後臺代理代碼

Namespace LocationLogTaskAgent

{

Public class ScheduledAgent:ScheduledTaskAgent

{

Protected override void OnInvoke(ScheduledTask task)

{

NotifyComplete();

}

}

}

我們必須在OnInvoke方法中實現代理功能

當其完成時通知系統

後臺代理的數據分享

Protected override void OnInvoke(ScheduledTask task)

{

String message="";

String logString="";

If(LoadLogFromIsolatedStorageFile()

{

Message="Loaded";

}

Else{

Message="Initialised";

}

……

}

第一件事情代理完成的就是從獨立存儲空間加載日誌字符串

在日誌的末尾加上當前的位置信息

數據訪問

Public bool LoadLogFromIsolatedStorageFile()

{

Mut.WaitOne();//wait until it is safe to enter

Try{

//read the file here

Return true;

}

Catch{

LogText="";

Return false;

}

Finally{

Mut.ReleaseMutex();//release the Mutex.

}

通過互斥保護訪問獨立存儲空間的文件

訪問結束後釋放互斥

顯示通知

Protected override void OnInvoke(ScheduledTask task)

{

……

ShellToast toast =new ShellToast();

Toast.Title="Location Log";

Toast.Content=message;

Toast.Show();

……

}

後臺任務可以發送Toast通知的消息

如果用戶輕觸通知消息,則則會啓動前臺的應用

Toast通知消息在前臺主應用啓動時不會顯示

計劃任務

PeriodicTask  t;

t=SecheduledActionService.Find(taskName) as PeroidicTask;

Bool fond=(t!=null);

If(!found)

{

t=new PeriodicTask(taskName);

}

t.Description=description;

t.ExpirationTime=DataTime.Now.AddDays(10);

If(!found)

{

ScheduledActionService.Add(t);

}

Else

{

ScheduledActionService.Remove(taskName);

ScheduledActionService.Add(t);

}

調試後臺任務

#if DEBUG_AGENT

ScheduledActionService.LaunchForTest(taskName,TimeSpan.FromSeconds(60);

#endif

如果調試代碼時,我們需要等待30分鐘看後臺代理的執行結果,那麼將是非常令人懊惱的

如果我們正在調試代碼,可以強制啓動代理服務

這樣的代碼可以在Release編譯時被有條件的排除

後臺代理最佳做法

最小化網絡請求的次數和頻率

停止活動的TimerDispatcherTimer對象,如果它們僅用於前臺功能(如UI )

停止所有XAML動畫

如果應用程序不再需要在後臺運行,通過移除Geolocator類的PositionChangedStatusChanged事件的事件處理程序或通過調用GeoCoordinateWatcher類的Stop()方法停止跟蹤位置

後臺文件傳輸

可創建後臺文件傳輸的任務從獨立存儲空間傳送文件

即使應用沒有運行,傳輸仍舊可以運行

應用程序可監視下載狀態,並顯示其進度

後臺傳輸服務僅支持使用HTTPHTTPS的傳輸,不支持FTP

應用程序管理傳輸任務的隊列

應用可查詢激活的傳輸狀態

後臺傳輸用戶界面最佳做法

後臺文件傳輸應該有用戶啓動,如通過點擊某個按鈕

您必須提供允許用戶查看所有後臺傳輸的狀態和傳輸進度的UI

必須提供用戶取消任何以及所有當前傳輸的機制

使用將文件傳輸限制爲僅通過Wi-Fi以及在連有外部電源時進行的默認傳輸首選項。可以使用TransferPreferences屬性設置用戶的選擇

如果後臺傳輸的狀態爲WaitingForExternalPower,WatingForExternalPowerDueToBatterySaverMode,WatingForWiFiWatingForNonVoiceBlockingNetWork,則向用戶提供一個消息,通知他們傳輸正在等待的原因(恢復傳輸的步驟)

後臺傳輸應遵循的建議

在關聯的傳輸操作完成之前,不要嘗試訪問或修改“/shared/transfers”目錄中的目標文件

BackgroundTransferRequest對象的Tag屬性可用於將關聯的自定義數據與某個傳輸關聯

訪問Requests屬性時,會創建BackgroundTransferRequest的新實例。建議

爲防止內存泄露,建議您避免經常(如在某個遊戲循環中)訪問此屬性來查詢請求數量

只要不再使用返回的對象,就迅速處置它們。相同的建議也適用於Find(String)方法,該方法在找到提供的傳輸ID時將創建新的實例

TransferStatusChangedTransferProgressChanged事件的事件處理程序應該快速返回以便用戶界面不會變得行動遲緩。從獨立存儲中讀取以及向獨立存儲中寫入的速度可能很慢,如果有可能的話,應該在單獨的工作線程上執行

TotalBytesToReceive屬性指示文件下載的總大小。如果該值爲-1,則表示文件大小未知。

服務器應該在HTTP響應標頭中返回內容長度,以便讓用戶知道傳輸的大小和進度

服務器必須支持來着客戶端的Range請求以改進性能。後臺傳輸有可能會在進行時暫停和恢復。不支持Range請求將導致性能降低,因爲傳輸一旦暫停,必須重新啓動

建議您在瀏覽器中或者通過後臺傳輸應用程序外部的某一個其他機制測試服務器端功能以確保正常工作

發佈了28 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章