UWP開發(fā):教你給App加上動態(tài)磁貼
UWP應用的一大特色就是動態(tài)磁貼,所以,你的應用如果還沒有設置動態(tài)磁貼,那么,和我一起來為應用加上動態(tài)磁貼吧!
UWP動態(tài)磁貼可以通過消息推送實現(xiàn),可以通過后臺任務實現(xiàn)。我所用的方式,是通過注冊后臺任務的方式來實現(xiàn)。
方法:
使用后臺任務更新動態(tài)磁貼:
其中,用到的API主要有如下兩個。
第一步:創(chuàng)建后臺任務項目:
要為應用啟用動態(tài)磁貼,請向你的解決方案中添加一個新的 Windows 運行時組件項目。這是一個獨立程序集,當用戶安裝你的應用時,OS 需要在后臺加載并運行該程序集。
在解決方案資源管理器中,右鍵單擊該解決方案,指向“添加”,然后單擊或點擊“新建項目”。
在“添加新項目”對話框的“Visual C#”>“Windows 應用商店”部分中,選擇“Windows 運行時組件”模板。
命名 BackgroundTasks 項目,然后單擊或點擊“確定”。Microsoft Visual Studio 即會將這個新項目添加到該解決方案。
在主項目中,向 BackgroundTasks 項目添加一個引用。
如下圖:

第二步:實現(xiàn)后臺任務
實現(xiàn)IBackgroundTask接口,以創(chuàng)建用于更新應用的動態(tài)磁貼的類。后臺工作將采用 Run 方法。
在解決方案資源管理器中,將自動生成的文件 Class1.cs 重命名為 BlogFeedBackgroundTask.cs。
在 BlogFeedBackgroundTask.cs 中,將自動生成的代碼替換為BlogFeedBackgroundTask類的存根代碼。
在 Run 方法的實現(xiàn)過程中,添加GetBlogFeed和UpdateTile方法的代碼。
這里以請求在線XML文檔為例,就以我們的RSS訂閱為例,下面的方法,將會實現(xiàn),把IT追夢園的新文章顯示到動態(tài)磁貼上!想想不用打開App都知道我更新了些什么,是不是很酷?(好吧,雖然我還是想讓你打開app看看的……)
這個運行時組件里面的代碼如下:
using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;using System.Text;using System.Threading.Tasks;using Windows.ApplicationModel.Background;using Windows.Data.Xml.Dom;using Windows.UI.Notifications;using Windows.Web.Syndication;namespace BackgroundTasks{? ? public sealed class BlogFeedBackgroundTask? : IBackgroundTask? ? {//首先,我們處理一下獲取IT追夢園的RSS訂閱,返回XML文檔的方法。前兩個是設置一下網(wǎng)絡請求頭的信息。(可以忽略)static string customHeaderName = "User-Agent";? ? ? ? ? static string customHeaderValue = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2;? ? ? ? ? WOW64; Trident/6.0)";//這里是IT追夢園的RSS地址:static string feedUrl = @"http://www.zmy123.cn/?feed=rss2";//這里定義一個textElementName,用來在后面顯示該節(jié)點請求到的數(shù)據(jù)static string textElementName = "text";//注意:這里是后臺任務的開始,等我們寫完代碼,在這里打斷點調(diào)試,看后臺任務是否可以進行到這里!public async void Run( IBackgroundTaskInstance taskInstance )? ? ? ? {? ? ? ? ? ? ? ? ? ? ? BackgroundTaskDeferral deferral = taskInstance.GetDeferral();? ? ? ? ? ? var feed = await GetBlogFeed();? ? ? ? ? ? UpdateTile( feed );? ? ? ? ? ? deferral.Complete();? ? ? ? }? ? ? ? private static async Task GetBlogFeed()? ? ? ? {? ? ? ? ? ? SyndicationFeed feed = null;? ? ? ? ? ? try? ? ? ? ? ? {//這里都是請求最XML地址的方法,并獲取到XML文檔。SyndicationClient client = new SyndicationClient();? ? ? ? ? ? ? ? client.BypassCacheOnRetrieve = true;? ? ? ? ? ? ? ? client.SetRequestHeader( customHeaderName, customHeaderValue );//這里我們獲取到了XML文檔 feedfeed = await client.RetrieveFeedAsync( new Uri( feedUrl ) );? ? ? ? ? ? }? ? ? ? ? ? catch( Exception ex )? ? ? ? ? ? {? ? ? ? ? ? ? ? Debug.WriteLine( ex.ToString() );? ? ? ? ? ? }? ? ? ? ? ? return feed;? ? ? ? }//更新磁貼的方法private static void UpdateTile( SyndicationFeed feed )? ? ? ? {//通過這個方法,我們就可以為動態(tài)磁貼的添加做基礎。var updater = TileUpdateManager.CreateTileUpdaterForApplication();//這里設置的是所以磁貼都可以為動態(tài)updater.EnableNotificationQueue( true );? ? ? ? ? ? updater.Clear();? ? ? ? ? ? int itemCount = 0;//然后這里是重點:記得分3步走:foreach( var item in feed.Items )? ? ? ? ? ? {//1:創(chuàng)建xml對象,這里看你想顯示幾種動態(tài)磁貼,如果想顯示正方形和長方形的,那就分別設置一個動態(tài)磁貼類型即可。//下面這兩個分別是矩形的動態(tài)磁貼,和方形的動態(tài)磁貼,具體樣式,自己可以去微軟官網(wǎng)查一查。我這里用到的是換行的文字形式。XmlDocument tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWideText03 );?? ? ? ? ? ? ? XmlDocument tilexml2 = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);? ? ? ? ? ? ? ? var title = item.Title;? ? ? ? ? ? ? ? string titleText = title.Text == null ? String.Empty : title.Text;//2.接著給這個xml對象賦值tileXml.GetElementsByTagName( textElementName )[0].InnerText = titleText;//3.然后用Update方法來更新這個磁貼updater.Update( new TileNotification( tileXml ) );//4.最后這里需要注意的是微軟規(guī)定動態(tài)磁貼的隊列數(shù)目小于5個,所以這里做出判斷。if( itemCount++ > 5 ) break;? ? ? ? ? ? }? ? ? ? }? ? ? ? ? }}
第三步:設置包清單
打開它并添加一個新的后臺任務聲明。 將該任務的入口點設置為類名稱,包括其命名空間。
在解決方案資源管理器中,打開 Package.appxmanifest。
單擊或點擊“聲明”選項卡。
在“可用聲明”下,選擇“BackgroundTasks”,然后單擊“添加”。Visual Studio 即會將“BackgroundTasks”添加到“支持的聲明”下。
在“支持的任務類型”下,確保已選中“計時器”。
在“應用設置”下,將入口點設置為“BackgroundTasks.BlogFeedBackgroundTask”。
單擊或點擊“應用程序 UI”選項卡。
將“鎖屏通知”設置為“鎖屏提醒和磁貼文本”。
在“鎖屏提醒徽標”字段中,設置一個 24x24 像素圖標的路徑。
這里也要注意一下,設置磁貼不要設置錯了,設置完,記得刪除原來的,要不然會報錯。
如下圖:

第四步:注冊后臺任務
這里用到BackgroundTaskBuilder以注冊任務。
?到這里,我們就回到應用主頁中:
在應用的主頁中,添加RegisterBackgroundTask方法并在OnNavigatedTo事件處理程序中進行調(diào)用。
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Threading.Tasks;using Windows.ApplicationModel.Background;using Windows.Data.Xml.Dom;using Windows.Foundation;using Windows.Foundation.Collections;using Windows.UI.Xaml;using Windows.UI.Xaml.Controls;using Windows.UI.Xaml.Controls.Primitives;using Windows.UI.Xaml.Data;using Windows.UI.Xaml.Input;using Windows.UI.Xaml.Media;using Windows.UI.Xaml.Navigation;using Windows.Web.Syndication;// The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?LinkID=234238namespace ContosoApp{? ? /// ? ? /// An empty page that can be used on its own or navigated to within a Frame.? ? /// ? ? public sealed partial class MainPage : Page? ? {? ? ? ? public MainPage()? ? ? ? {? ? ? ? ? ? this.InitializeComponent();? ? ? ? }protected override void OnNavigatedTo( NavigationEventArgs e )? ? ? ? {//在這里注冊我們那個運行時組件里的后臺任務。this.RegisterBackgroundTask();? ? ? ? }? ? ? ? private async void RegisterBackgroundTask()? ? ? ? {//這里就是磁貼更新周期的一些邏輯處理var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();? ? ? ? ? ? if( backgroundAccessStatus == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity ||? ? ? ? ? ? ? ? backgroundAccessStatus == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity )? ? ? ? ? ? {? ? ? ? ? ? ? ? foreach( var task in BackgroundTaskRegistration.AllTasks )? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? if( task.Value.Name == taskName )? ? ? ? ? ? ? ? ? ? {? ? ? ? ? ? ? ? ? ? ? ? task.Value.Unregister( true );? ? ? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? }? ? ? ? ? ? ? ? BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();? ? ? ? ? ? ? ? taskBuilder.Name = taskName;? ? ? ? ? ? ? ? taskBuilder.TaskEntryPoint = taskEntryPoint;? ? ? ? ? ? ? ? taskBuilder.SetTrigger( new TimeTrigger( 15, false ) );? ? ? ? ? ? ? ? var registration = taskBuilder.Register();? ? ? ? ? ? }? ? ? ? }? ? ? ? private const string taskName = "BlogFeedBackgroundTask";? ? ? ? private const string taskEntryPoint = "BackgroundTasks.BlogFeedBackgroundTask";}}
第五步:調(diào)試后臺任務
要調(diào)試后臺任務,在該任務的 Run 方法中設置一個斷點。 在“調(diào)試位置”工具欄中,選擇你的后臺任務。這將導致系統(tǒng)立即調(diào)用 Run 方法。
在該任務的 Run 方法中設置一個斷點。
按 F5 或點擊“調(diào)試”>“啟動調(diào)試”以部署和運行該應用。
應用啟動后,切換回 Visual Studio。
確保顯示“調(diào)試位置”工具欄。該工具欄位于“查看”>“工具欄”菜單。
在“調(diào)試位置”工具欄上,單擊“暫?!毕吕藛?,然后選擇“BlogFeedBackgroundTask”。
Visual Studio 會在斷點位置暫停執(zhí)行。
按 F5 點擊“調(diào)試”>“繼續(xù)”以繼續(xù)運行該應用。
按 Shift+F5 或點擊“調(diào)試”>“停止調(diào)試”以停止調(diào)試。
返回到“開始”屏幕上的該應用的磁貼。幾秒鐘后,你的應用的磁貼上將會顯示磁貼通知了!
如下圖:

注意:這里不能直接部署,要通過掛起B(yǎng)logFeedBackgroundTask才能觸發(fā)后臺任務,所以如果你看不到動態(tài)磁貼,就注意一下上邊最后一步里面的操作。我之前就是在這里疑惑了好久。這樣,我們IT追夢園的APP上就能顯示動態(tài)磁貼了,而且上面顯示的都是我最近更新的內(nèi)容, 是不是很酷?(好怕啊,這樣你們會不會不打開我的APP了。。。)


好了,如果你也喜歡UWP開發(fā),或者有什么問題,可以加入193148992,共同學習交流^_^。