UWP開(kāi)發(fā):給App加上動(dòng)態(tài)磁貼

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è)译秦。

IBackgroundTask

BackgroundTaskBuilder

第一步:創(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ò)程中矾削,添加GetBlogFeedUpdateTile方法的代碼壤玫。


這里以請(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í)組件里面的代碼如下:

C#


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)用。

C#


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í)交流^_^。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末网棍,一起剝皮案震驚了整個(gè)濱河市黔龟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌确沸,老刑警劉巖捌锭,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罗捎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拉盾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)桨菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人捉偏,你說(shuō)我怎么就攤上這事倒得。” “怎么了夭禽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵霞掺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我讹躯,道長(zhǎng)菩彬,這世上最難降的妖魔是什么缠劝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮骗灶,結(jié)果婚禮上惨恭,老公的妹妹穿的比我還像新娘。我一直安慰自己耙旦,他們只是感情好脱羡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著免都,像睡著了一般锉罐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绕娘,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天氓鄙,我揣著相機(jī)與錄音,去河邊找鬼业舍。 笑死抖拦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舷暮。 我是一名探鬼主播态罪,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼下面!你這毒婦竟也來(lái)了复颈?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沥割,失蹤者是張志新(化名)和其女友劉穎耗啦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體机杜,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帜讲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了椒拗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片似将。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚀苛,靈堂內(nèi)的尸體忽然破棺而出在验,到底是詐尸還是另有隱情,我是刑警寧澤堵未,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布腋舌,位于F島的核電站,受9級(jí)特大地震影響渗蟹,放射性物質(zhì)發(fā)生泄漏块饺。R本人自食惡果不足惜赞辩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刨沦。 院中可真熱鬧诗宣,春花似錦、人聲如沸想诅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)来破。三九已至篮灼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徘禁,已是汗流浹背诅诱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送朱,地道東北人娘荡。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驶沼,于是被迫代替她去往敵國(guó)和親炮沐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容