原文:UWP-动态磁贴

来自:IT追梦园 (http://www.zmy123.cn/?p=1172)

UWP应用的一大特色就是动态磁贴,所以,你的应用如果还没有设置动态磁贴,那么,和我一起来为应用加上动态磁贴吧!

UWP动态磁贴可以通过消息推送实现,可以通过后台任务实现。我所用的方式,是通过注册后台任务的方式来实现。

方法:

使用后台任务更新动态磁贴:

其中,用到的API主要有如下两个。

第一步:创建后台任务项目:

要为应用启用动态磁贴,请向你的解决方案中添加一个新的 Windows 运行时组件项目。这是一个独立程序集,当用户安装你的应用时,OS 需要在后台加载并运行该程序集。

  1. 在解决方案资源管理器中,右键单击该解决方案,指向“添加”,然后单击或点击“新建项目”。
  2. 在“添加新项目”对话框的“Visual C#”>“Windows 应用商店”部分中,选择“Windows 运行时组件”模板。
  3. 命名 BackgroundTasks 项目,然后单击或点击“确定”。Microsoft Visual Studio 即会将这个新项目添加到该解决方案。
  4. 在主项目中,向 BackgroundTasks 项目添加一个引用。

如下图:

第二步:实现后台任务

实现 IBackgroundTask 接口,以创建用于更新应用的动态磁贴的类。后台工作将采用 Run 方法。

  1. 在解决方案资源管理器中,将自动生成的文件 Class1.cs 重命名为 BlogFeedBackgroundTask.cs。
  2. 在 BlogFeedBackgroundTask.cs 中,将自动生成的代码替换为 BlogFeedBackgroundTask 类的存根代码。
  3. 在 Run 方法的实现过程中,添加 GetBlogFeed 和 UpdateTile 方法的代码。

这里以请求在线XML文档为例,就以我们 IT追梦园 的RSS订阅为例,下面的方法,将会实现,把IT追梦园的新文章显示到动态磁贴上!想想不用打开App都知道我更新了些什么,是不是很酷?(好吧,虽然我还是想让你打开app看看的……)

这个运行时组件里面的代码如下:

 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using Windows.ApplicationModel.Background;
  8. using Windows.Data.Xml.Dom;
  9. using Windows.UI.Notifications;
  10. using Windows.Web.Syndication;
  11.  
  12. namespace BackgroundTasks
  13. {
  14. public sealed class BlogFeedBackgroundTask : IBackgroundTask
  15. {
  16. //首先,我们处理一下获取IT追梦园的RSS订阅,返回XML文档的方法。前两个是设置一下网络请求头的信息。(可以忽略)
  17. static string customHeaderName = "User-Agent";
  18. static string customHeaderValue = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2;
  19. WOW64; Trident/6.0)";
  20. //这里是IT追梦园的RSS地址:
  21. static string feedUrl = @"http://www.zmy123.cn/?feed=rss2";
  22. //这里获取它节点为text的值
  23. static string textElementName = "text";
  24.  
  25. //注意:这里是后台任务的开始,等我们写完代码,在这里打断点调试,看后台任务是否可以进行到这里!
  26. public async void Run( IBackgroundTaskInstance taskInstance )
  27. {
  28.  
  29. BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
  30.  
  31. var feed = await GetBlogFeed();
  32.  
  33. UpdateTile( feed );
  34.  
  35. deferral.Complete();
  36. }
  37.  
  38. private static async Task<SyndicationFeed> GetBlogFeed()
  39. {
  40. SyndicationFeed feed = null;
  41.  
  42. try
  43. {
  44. //这里都是请求最线XML地址的方法,并获取到XML文档。
  45. SyndicationClient client = new SyndicationClient();
  46. client.BypassCacheOnRetrieve = true;
  47. client.SetRequestHeader( customHeaderName, customHeaderValue );
  48. //这里我们获取到了XML文档 feed
  49. feed = await client.RetrieveFeedAsync( new Uri( feedUrl ) );
  50. }
  51. catch( Exception ex )
  52. {
  53. Debug.WriteLine( ex.ToString() );
  54. }
  55.  
  56. return feed;
  57. }
  58.  
  59. //更新磁贴的方法
  60. private static void UpdateTile( SyndicationFeed feed )
  61. {
  62. //通过这个方法,我们就可以为动态磁贴的添加做基础。
  63. var updater = TileUpdateManager.CreateTileUpdaterForApplication();
  64.  
  65. //这里设置的是所以磁贴都可以为动态
  66. updater.EnableNotificationQueue( true );
  67. updater.Clear();
  68. int itemCount = ;
  69.  
  70. //然后这里是重点:记得分3步走:
  71. foreach( var item in feed.Items )
  72. {
  73. //1:创建xml对象,这里看你想显示几种动态磁贴,如果想显示正方形和长方形的,那就分别设置一个动态磁贴类型即可。
  74. //下面这两个分别是矩形的动态磁贴,和方形的动态磁贴,具体样式,自己可以去微软官网查一查。我这里用到的是换行的文字形式。
  75. XmlDocument tileXml = TileUpdateManager.GetTemplateContent( TileTemplateType.TileWideText03 );
  76. XmlDocument tilexml2 = TileUpdateManager.GetTemplateContent(TileTemplateType.TileSquareText04);
  77. var title = item.Title;
  78. string titleText = title.Text == null ? String.Empty : title.Text;
  79. //2.接着给这个xml对象赋值
  80. tileXml.GetElementsByTagName( textElementName )[].InnerText = titleText;
  81.  
  82. //3.然后用Update方法来更新这个磁贴
  83. updater.Update( new TileNotification( tileXml ) );
  84.  
  85. //4.最后这里需要注意的是微软规定动态磁贴的队列数目小于5个,所以这里做出判断。
  86. if( itemCount++ > ) break;
  87. }
  88. }
  89.  
  90. }
  91. }

第三步:设置包清单

打开它并添加一个新的后台任务声明。 将该任务的入口点设置为类名称,包括其命名空间。

  1. 在解决方案资源管理器中,打开 Package.appxmanifest。
  2. 单击或点击“声明”选项卡。
  3. 在“可用声明”下,选择“BackgroundTasks”,然后单击“添加”。Visual Studio 即会将“BackgroundTasks”添加到“支持的声明”下。
  4. 在“支持的任务类型”下,确保已选中“计时器”。
  5. 在“应用设置”下,将入口点设置为“BackgroundTasks.BlogFeedBackgroundTask”。
  6. 单击或点击“应用程序 UI”选项卡。
  7. 将“锁屏通知”设置为“锁屏提醒和磁贴文本”。
  8. 在“锁屏提醒徽标”字段中,设置一个 24×24 像素图标的路径。
    这里也要注意一下,设置磁贴不要设置错了,设置完,记得删除原来的,要不然会报错。

如下图:

第四步:注册后台任务

这里用到BackgroundTaskBuilder 以注册任务。

 到这里,我们就回到应用主页中:

在应用的主页中,添加 RegisterBackgroundTask 方法并在 OnNavigatedTo 事件处理程序中进行调用。

 
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using Windows.ApplicationModel.Background;
  7. using Windows.Data.Xml.Dom;
  8. using Windows.Foundation;
  9. using Windows.Foundation.Collections;
  10. using Windows.UI.Xaml;
  11. using Windows.UI.Xaml.Controls;
  12. using Windows.UI.Xaml.Controls.Primitives;
  13. using Windows.UI.Xaml.Data;
  14. using Windows.UI.Xaml.Input;
  15. using Windows.UI.Xaml.Media;
  16. using Windows.UI.Xaml.Navigation;
  17. using Windows.Web.Syndication;
  18.  
  19. // The Blank Page item template is documented at http://go.microsoft.com/fwlink/p/?LinkID=234238
  20.  
  21. namespace ContosoApp
  22. {
  23. /// <summary>
  24. /// An empty page that can be used on its own or navigated to within a Frame.
  25. /// </summary>
  26. public sealed partial class MainPage : Page
  27. {
  28. public MainPage()
  29. {
  30. this.InitializeComponent();
  31. }
  32.  
  33. protected override void OnNavigatedTo( NavigationEventArgs e )
  34. {
  35. //在这里注册我们那个运行时组件里的后台任务。
  36. this.RegisterBackgroundTask();
  37. }
  38.  
  39. private async void RegisterBackgroundTask()
  40. {
  41. //这里就是磁贴更新周期的一些逻辑处理
  42. var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
  43. if( backgroundAccessStatus == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity ||
  44. backgroundAccessStatus == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity )
  45. {
  46. foreach( var task in BackgroundTaskRegistration.AllTasks )
  47. {
  48. if( task.Value.Name == taskName )
  49. {
  50. task.Value.Unregister( true );
  51. }
  52. }
  53.  
  54. BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
  55. taskBuilder.Name = taskName;
  56. taskBuilder.TaskEntryPoint = taskEntryPoint;
  57. taskBuilder.SetTrigger( new TimeTrigger( , false ) );
  58. var registration = taskBuilder.Register();
  59. }
  60. }
  61.  
  62. private const string taskName = "BlogFeedBackgroundTask";
  63. private const string taskEntryPoint = "BackgroundTasks.BlogFeedBackgroundTask";
  64. }
  65. }

第五步:调试后台任务

要调试后台任务,在该任务的 Run 方法中设置一个断点。 在“调试位置”工具栏中,选择你的后台任务。这将导致系统立即调用 Run 方法。

  1. 在该任务的 Run 方法中设置一个断点。
  2. 按 F5 或点击“调试”>“启动调试”以部署和运行该应用。
  3. 应用启动后,切换回 Visual Studio。
  4. 确保显示“调试位置”工具栏。该工具栏位于“查看”>“工具栏”菜单。
  5. 在“调试位置”工具栏上,单击“暂停”下拉菜单,然后选择“BlogFeedBackgroundTask”。
  6. Visual Studio 会在断点位置暂停执行。
  7. 按 F5 点击“调试”>“继续”以继续运行该应用。
  8. 按 Shift+F5 或点击“调试”>“停止调试”以停止调试。
  9. 返回到“开始”屏幕上的该应用的磁贴。几秒钟后,你的应用的磁贴上将会显示磁贴通知了!

如下图:

注意:这里不能直接部署,要通过挂起BlogFeedBackgroundTask才能触发后台任务,所以如果你看不到动态磁贴,就注意一下上边最后一步里面的操作。我之前就是在这里疑惑了好久。这样,我们IT追梦园的APP上就能显示动态磁贴了,而且上面显示的都是我最近更新的内容, 是不是很酷?(好怕啊,这样你们会不会不打开我的APP了。。。)

来自:IT追梦园 (http://www.zmy123.cn/?p=1172)

UWP-动态磁贴的更多相关文章

  1. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  2. win10 uwp 活动磁贴

    本文翻译:https://mobileprogrammerblog.wordpress.com/2015/12/23/live-tiles-and-notifications-in-universal ...

  3. WP8.1 Study18:动态磁贴

    一.前言 动态磁贴在WindowsPhone8.1和Windows8.1都是其特色,有人喜欢有人讨厌,不过我觉得还是挺好的,可以让使用者很快知道App内的内容和吸引使用者打开App.下面来学习下怎样添 ...

  4. Win8.1应用开发之动态磁贴

    using demo02.Common; using System; using System.Collections.Generic; using System.IO; using System.L ...

  5. wp8.1 创建动态磁贴应用

    目前Windows Phone 8.1所支持磁贴像素大小有71x71.150x150和310x150,分为大中小三种模式,对于桌面磁贴微软提供的诸多模板http://msdn.microsoft.co ...

  6. UWP Windows10开发更新磁贴和动态更新磁贴

    下面将介绍两种方式如何在windows10 uwp开发中如何更新应用磁贴: 实际上windows的磁贴就是用xml实现的,你只需要创建相应格式的xml就可以实现动态磁贴了 一,手动更新磁贴 二,轮询更 ...

  7. UWP 磁贴设置

    一:需求 一款好看好用的应用,对于UWP来说,动态的磁贴必不可少. 二:TileUpdateManager类 和TileUpdater类 如果需要更改或更新应用的磁贴,那么首先需要获得TileUpda ...

  8. UWP应用开发系列视频教程简介 - Built for Windows 10

    万分感谢Fdyo同学给我们带来的有中文字幕的系列教程! http://zhuanlan.zhihu.com/MSFaith/20364660 下面是这系列video教程中的一个截图作为示例,有代码,有 ...

  9. 想找个计算器当本命?来试试UWP应用《纸书科学计算器》

    久违了.上次在博客园发文还是4年前,正是高中参加NOIP的时候.这4年里发生了很多事,乃至再次看到过去的文章时,仿佛看到了自己也不熟悉的风景.最近很想把我的博客重新拾起来,慢慢灌溉,写一些微不足道的技 ...

随机推荐

  1. HDU 5293 Train chain Problem - 树链剖分(树状数组) + 线段树+ 树型dp

    传送门 题目大意: 一颗n个点的树,给出m条链,第i条链的权值是\(w_i\),可以选择若干条不相交的链,求最大权值和. 题目分析: 树型dp: dp[u][0]表示不经过u节点,其子树的最优值,dp ...

  2. hadoop 3.x Replication与Availability不一致

    看下面的文字前先确保你的Replication值不大于你设置的虚拟机数量 如图,显示的副本数为3,但是实际可用的只有一台机器,查看了下hadoop003,hadoop004两台机器,果然没有存储数据, ...

  3. Linux下安装mysql(2) 及常见问题解决(CentOS)

    上一篇讲了基本的安装,这篇姑且算作进阶吧 链接Linux下安装mysql(1) 1.准备好mysql的rpm安装包 2.解压并进入usr/local/mysql 3.先执行useradd mysql( ...

  4. 左右Cwnd::Create()功能出现afxwin1.inl line:21错误的解决方案

    我最近在调试dll时刻,有一种模糊的断言错误,它是由主程序创建MFC 扩张DLL控制出口(从控制继承CWnd分类)时刻,呼叫Create()下列说法错误的功能: watermark/2/text/aH ...

  5. TableLayout表格布局

    1.本节学习路线图 路线图分析: 从上面的路线图,可以看出TableLayout的用法还是很简单的,无非就是确定表格的行数,以及使用 那三个属性来设置每一行中的第某列的元素隐藏,拉伸,或者收缩即可! ...

  6. mac在终端打开应用程序

    今天研究了下mac终端的启动流程.以下以sublime为例,介绍怎么在mac的终端中加入app启动方法. 方法1 :使用"open -a /Applications/Sublime\ Tex ...

  7. Arcgis api for javascript学习笔记(4.6版本) - 二维MapView中的FeatureLayer显示标注

    4.6版本api的FeatureLayer中有提供 labelsVisible 和 labelingInfo 两个属性,设置这两个属性可以实现显示将属性中某个字段作为标注.但是这两个属性只针对三维Sc ...

  8. [Example of Sklearn] - SVM usge

    reference : http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine SVM是什么? SVM是一种训练机器 ...

  9. 微信公众平台消息接口开发(2)你的服务器没有正确响应Token验证的解决方法

    你的服务器没有正确响应Token验证,请阅读消息接口使用指南 微信 微信公众平台开发模式 平台 消息 接口 启用 URL Token作者:http://txw1958.cnblogs.com/ 本系统 ...

  10. arcserver开发小结(三)

    一.关于网络数据集的制作 由于要做实现网络分析的功能,而手中却没有网络数据集,关于网络数据集的制作,网上也有不少的资料.我参考的是ESRI为我们提供的帮助文档(Network_Analyst_Tuto ...