UWP開(kāi)發(fā):教你給App加上動(dòng)態(tài)磁貼
UWP應(yīng)用的一大特色就是動(dòng)態(tài)磁貼也切,所以只壳,你的應(yīng)用如果還沒(méi)有設(shè)置動(dòng)態(tài)磁貼,那么极景,和我一起來(lái)為應(yīng)用加上動(dòng)態(tài)磁貼吧察净!
UWP動(dòng)態(tài)磁貼可以通過(guò)消息推送實(shí)現(xiàn),可以通過(guò)后臺(tái)任務(wù)實(shí)現(xiàn)盼樟。我所用的方式氢卡,是通過(guò)注冊(cè)后臺(tái)任務(wù)的方式來(lái)實(shí)現(xiàn)。
方法:
使用后臺(tái)任務(wù)更新動(dòng)態(tài)磁貼:
其中晨缴,用到的API主要有如下兩個(gè)译秦。
第一步:創(chuàng)建后臺(tái)任務(wù)項(xiàng)目:
要為應(yīng)用啟用動(dòng)態(tài)磁貼,請(qǐng)向你的解決方案中添加一個(gè)新的 Windows 運(yùn)行時(shí)組件項(xiàng)目击碗。這是一個(gè)獨(dú)立程序集筑悴,當(dāng)用戶安裝你的應(yīng)用時(shí),OS 需要在后臺(tái)加載并運(yùn)行該程序集稍途。
在解決方案資源管理器中阁吝,右鍵單擊該解決方案,指向“添加”械拍,然后單擊或點(diǎn)擊“新建項(xiàng)目”突勇。
在“添加新項(xiàng)目”對(duì)話框的“Visual C#”>“Windows 應(yīng)用商店”部分中,選擇“Windows 運(yùn)行時(shí)組件”模板坷虑。
命名 BackgroundTasks 項(xiàng)目甲馋,然后單擊或點(diǎn)擊“確定”。Microsoft Visual Studio 即會(huì)將這個(gè)新項(xiàng)目添加到該解決方案猖吴。
在主項(xiàng)目中摔刁,向 BackgroundTasks 項(xiàng)目添加一個(gè)引用。
如下圖:
第二步:實(shí)現(xiàn)后臺(tái)任務(wù)
實(shí)現(xiàn)IBackgroundTask接口海蔽,以創(chuàng)建用于更新應(yīng)用的動(dòng)態(tài)磁貼的類(lèi)共屈。后臺(tái)工作將采用 Run 方法。
在解決方案資源管理器中党窜,將自動(dòng)生成的文件 Class1.cs 重命名為 BlogFeedBackgroundTask.cs拗引。
在 BlogFeedBackgroundTask.cs 中,將自動(dòng)生成的代碼替換為BlogFeedBackgroundTask類(lèi)的存根代碼幌衣。
在 Run 方法的實(shí)現(xiàn)過(guò)程中矾削,添加GetBlogFeed和UpdateTile方法的代碼壤玫。
這里以請(qǐng)求在線XML文檔為例,就以我們的RSS訂閱為例哼凯,下面的方法欲间,將會(huì)實(shí)現(xiàn),把IT追夢(mèng)園的新文章顯示到動(dòng)態(tài)磁貼上断部!想想不用打開(kāi)App都知道我更新了些什么猎贴,是不是很酷?(好吧蝴光,雖然我還是想讓你打開(kāi)app看看的……)
這個(gè)運(yùn)行時(shí)組件里面的代碼如下:
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追夢(mèng)園的RSS訂閱,返回XML文檔的方法蔑祟。前兩個(gè)是設(shè)置一下網(wǎng)絡(luò)請(qǐ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追夢(mèng)園的RSS地址:static string feedUrl = @"http://www.zmy123.cn/?feed=rss2";//這里定義一個(gè)textElementName,用來(lái)在后面顯示該節(jié)點(diǎn)請(qǐng)求到的數(shù)據(jù)static string textElementName = "text";//注意:這里是后臺(tái)任務(wù)的開(kāi)始,等我們寫(xiě)完代碼疆虚,在這里打斷點(diǎn)調(diào)試苛败,看后臺(tái)任務(wù)是否可以進(jìn)行到這里!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? ? ? ? ? ? {//這里都是請(qǐng)求最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 )? ? ? ? {//通過(guò)這個(gè)方法纱扭,我們就可以為動(dòng)態(tài)磁貼的添加做基礎(chǔ)牍帚。var updater = TileUpdateManager.CreateTileUpdaterForApplication();//這里設(shè)置的是所以磁貼都可以為動(dòng)態(tài)updater.EnableNotificationQueue( true );? ? ? ? ? ? updater.Clear();? ? ? ? ? ? int itemCount = 0;//然后這里是重點(diǎn):記得分3步走:foreach( var item in feed.Items )? ? ? ? ? ? {//1:創(chuàng)建xml對(duì)象,這里看你想顯示幾種動(dòng)態(tài)磁貼乳蛾,如果想顯示正方形和長(zhǎng)方形的暗赶,那就分別設(shè)置一個(gè)動(dòng)態(tài)磁貼類(lèi)型即可。//下面這兩個(gè)分別是矩形的動(dòng)態(tài)磁貼肃叶,和方形的動(dòng)態(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.接著給這個(gè)xml對(duì)象賦值tileXml.GetElementsByTagName( textElementName )[0].InnerText = titleText;//3.然后用Update方法來(lái)更新這個(gè)磁貼updater.Update( new TileNotification( tileXml ) );//4.最后這里需要注意的是微軟規(guī)定動(dòng)態(tài)磁貼的隊(duì)列數(shù)目小于5個(gè),所以這里做出判斷蹦魔。if( itemCount++ > 5 ) break;? ? ? ? ? ? }? ? ? ? }? ? ? ? ? }}
第三步:設(shè)置包清單
打開(kāi)它并添加一個(gè)新的后臺(tái)任務(wù)聲明激率。 將該任務(wù)的入口點(diǎn)設(shè)置為類(lèi)名稱(chēng),包括其命名空間勿决。
在解決方案資源管理器中乒躺,打開(kāi) Package.appxmanifest。
單擊或點(diǎn)擊“聲明”選項(xiàng)卡低缩。
在“可用聲明”下嘉冒,選擇“BackgroundTasks”,然后單擊“添加”。Visual Studio 即會(huì)將“BackgroundTasks”添加到“支持的聲明”下讳推。
在“支持的任務(wù)類(lèi)型”下顶籽,確保已選中“計(jì)時(shí)器”。
在“應(yīng)用設(shè)置”下银觅,將入口點(diǎn)設(shè)置為“BackgroundTasks.BlogFeedBackgroundTask”蜕衡。
單擊或點(diǎn)擊“應(yīng)用程序 UI”選項(xiàng)卡。
將“鎖屏通知”設(shè)置為“鎖屏提醒和磁貼文本”设拟。
在“鎖屏提醒徽標(biāo)”字段中慨仿,設(shè)置一個(gè) 24x24 像素圖標(biāo)的路徑。
這里也要注意一下纳胧,設(shè)置磁貼不要設(shè)置錯(cuò)了镰吆,設(shè)置完,記得刪除原來(lái)的跑慕,要不然會(huì)報(bào)錯(cuò)万皿。
如下圖:
第四步:注冊(cè)后臺(tái)任務(wù)
這里用到BackgroundTaskBuilder以注冊(cè)任務(wù)。
?到這里核行,我們就回到應(yīng)用主頁(yè)中:
在應(yīng)用的主頁(yè)中牢硅,添加RegisterBackgroundTask方法并在OnNavigatedTo事件處理程序中進(jìn)行調(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 )? ? ? ? {//在這里注冊(cè)我們那個(gè)運(yùn)行時(shí)組件里的后臺(tái)任務(wù)芝雪。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)試后臺(tái)任務(wù)
要調(diào)試后臺(tái)任務(wù)减余,在該任務(wù)的 Run 方法中設(shè)置一個(gè)斷點(diǎn)。 在“調(diào)試位置”工具欄中惩系,選擇你的后臺(tái)任務(wù)位岔。這將導(dǎo)致系統(tǒng)立即調(diào)用 Run 方法。
在該任務(wù)的 Run 方法中設(shè)置一個(gè)斷點(diǎn)堡牡。
按 F5 或點(diǎn)擊“調(diào)試”>“啟動(dòng)調(diào)試”以部署和運(yùn)行該應(yīng)用抒抬。
應(yīng)用啟動(dòng)后,切換回 Visual Studio晤柄。
確保顯示“調(diào)試位置”工具欄擦剑。該工具欄位于“查看”>“工具欄”菜單。
在“調(diào)試位置”工具欄上芥颈,單擊“暫突堇眨”下拉菜單,然后選擇“BlogFeedBackgroundTask”浇借。
Visual Studio 會(huì)在斷點(diǎn)位置暫停執(zhí)行捉撮。
按 F5 點(diǎn)擊“調(diào)試”>“繼續(xù)”以繼續(xù)運(yùn)行該應(yīng)用。
按 Shift+F5 或點(diǎn)擊“調(diào)試”>“停止調(diào)試”以停止調(diào)試妇垢。
返回到“開(kāi)始”屏幕上的該應(yīng)用的磁貼巾遭。幾秒鐘后肉康,你的應(yīng)用的磁貼上將會(huì)顯示磁貼通知了!
如下圖:
注意:這里不能直接部署灼舍,要通過(guò)掛起B(yǎng)logFeedBackgroundTask才能觸發(fā)后臺(tái)任務(wù)吼和,所以如果你看不到動(dòng)態(tài)磁貼,就注意一下上邊最后一步里面的操作骑素。我之前就是在這里疑惑了好久炫乓。這樣,我們IT追夢(mèng)園的APP上就能顯示動(dòng)態(tài)磁貼了献丑,而且上面顯示的都是我最近更新的內(nèi)容末捣, 是不是很酷?(好怕啊创橄,這樣你們會(huì)不會(huì)不打開(kāi)我的APP了箩做。。妥畏。)
好了邦邦,如果你也喜歡UWP開(kāi)發(fā),或者有什么問(wèn)題醉蚁,可以加入193148992燃辖,共同學(xué)習(xí)交流^_^。