1. 程式人生 > >UWP-動態磁貼

UWP-動態磁貼

對象賦值 inpu 可用 access agen 換行 通過 client pack

原文:UWP-動態磁貼

來自:IT追夢園 (http://www.zmy123.cn/?p=1172)

UWP應用的一大特色就是動態磁貼,所以,你的應用如果還沒有設置動態磁貼,那麽,和我一起來為應用加上動態磁貼吧!

UWP動態磁貼可以通過消息推送實現,可以通過後臺任務實現。我所用的方式,是通過註冊後臺任務的方式來實現。

方法:

使用後臺任務更新動態磁貼:

其中,用到的API主要有如下兩個。

  • IBackgroundTask
  • BackgroundTaskBuilder

第一步:創建後臺任務項目:

要為應用啟用動態磁貼,請向你的解決方案中添加一個新的 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看看的……)

這個運行時組件裏面的代碼如下:

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追夢園的RSS訂閱,返回XML文檔的方法。前兩個是設置一下網絡請求頭的信息。(可以忽略)
         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";
//這裏獲取它節點為text的值
         static string textElementName = "text";
      

//註意:這裏是後臺任務的開始,等我們寫完代碼,在這裏打斷點調試,看後臺任務是否可以進行到這裏!
        public async void Run( IBackgroundTaskInstance taskInstance )
        {
          
            BackgroundTaskDeferral deferral = taskInstance.GetDeferral();

            var feed = await GetBlogFeed();

            UpdateTile( feed );

            deferral.Complete();
        }

        private static async Task<SyndicationFeed> GetBlogFeed()
        {
            SyndicationFeed feed = null;

            try
            {
//這裏都是請求最線XML地址的方法,並獲取到XML文檔。
                SyndicationClient client = new SyndicationClient();
                client.BypassCacheOnRetrieve = true;
                client.SetRequestHeader( customHeaderName, customHeaderValue );
//這裏我們獲取到了XML文檔 feed
                feed = await client.RetrieveFeedAsync( new Uri( feedUrl ) );
            }
            catch( Exception ex )
            {
                Debug.WriteLine( ex.ToString() );
            }

            return feed;
        }

//更新磁貼的方法
        private static void UpdateTile( SyndicationFeed feed )
        {
//通過這個方法,我們就可以為動態磁貼的添加做基礎。
            var updater = TileUpdateManager.CreateTileUpdaterForApplication();

//這裏設置的是所以磁貼都可以為動態
            updater.EnableNotificationQueue( true );
            updater.Clear();
            int itemCount = 0;

//然後這裏是重點:記得分3步走:
            foreach( var item in feed.Items )
            {
//1:創建xml對象,這裏看你想顯示幾種動態磁貼,如果想顯示正方形和長方形的,那就分別設置一個動態磁貼類型即可。
//下面這兩個分別是矩形的動態磁貼,和方形的動態磁貼,具體樣式,自己可以去微軟官網查一查。我這裏用到的是換行的文字形式。
                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.最後這裏需要註意的是微軟規定動態磁貼的隊列數目小於5個,所以這裏做出判斷。
                if( itemCount++ > 5 ) break;
            }
        }
      
    }
}

第三步:設置包清單

打開它並添加一個新的後臺任務聲明。 將該任務的入口點設置為類名稱,包括其命名空間。

  1. 在解決方案資源管理器中,打開 Package.appxmanifest。
  2. 單擊或點擊“聲明”選項卡。
  3. 在“可用聲明”下,選擇“BackgroundTasks”,然後單擊“添加”。Visual Studio 即會將“BackgroundTasks”添加到“支持的聲明”下。
  4. 在“支持的任務類型”下,確保已選中“計時器”。
  5. 在“應用設置”下,將入口點設置為“BackgroundTasks.BlogFeedBackgroundTask”。
  6. 單擊或點擊“應用程序 UI”選項卡。
  7. 將“鎖屏通知”設置為“鎖屏提醒和磁貼文本”。
  8. 在“鎖屏提醒徽標”字段中,設置一個 24×24 像素圖標的路徑。 這裏也要註意一下,設置磁貼不要設置錯了,設置完,記得刪除原來的,要不然會報錯。

如下圖:

技術分享

第四步:註冊後臺任務

這裏用到BackgroundTaskBuilder 以註冊任務。

到這裏,我們就回到應用主頁中:

在應用的主頁中,添加 RegisterBackgroundTask 方法並在 OnNavigatedTo 事件處理程序中進行調用。

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=234238

namespace ContosoApp
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    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";
    }
}

第五步:調試後臺任務

要調試後臺任務,在該任務的 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-動態磁貼