zoukankan      html  css  js  c++  java
  • Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

    一、前言

      昨天更新了10天前上架到windows8.1平台和windowsphone平台的通用应用“51单片机汇编”,总要是添加了动态磁贴以及ListView的Groupstyle应用。下面主要主要复习下如何利用后台任务添加动态磁贴

    二、动态磁贴

      动态磁贴也是前几天才掌握的,基本内容可以查看我之前的有关动态磁贴博文。在这里我理顺在我的应用中,利用backgroudtask动态更新磁贴。

    step1:首先先添加backgroutask组件。如图一、二

    step2:

    将backgroundtask引用到HubApp.windows及HubApp.windowsphone目录下,如下图:

    step3:改写backgrountask下的HubAppBackgroundTask类(具体名字可以任改),这是重要的,因为后台实际执行的内容就是在这个类下编写如图

    添加接口IBackgroundTask,实现接口代码如下:

     public sealed class HubAppBackgroundTask:IBackgroundTask
        {
            private static string FILENAME = "CodeCopyFile.XML";
            public async void Run(IBackgroundTaskInstance taskInstance)
            {
                BackgroundTaskDeferral deferral = taskInstance.GetDeferral();//必要的
                try//具体后台执行代码
                {
                      var code=await GetRandomCode();//磁贴的数据
                    if (code!=null)
                    {
                        TileSetter.CreatTiles(code);//更新磁贴
                    }
                }
                catch (Exception)
                {                
                    throw;
                }
                finally
                {
                    deferral.Complete();//必要的
                }
    
            }
    }

    其中更新磁贴TileSetter.CreatTiles(code)方法代码如下:
    public static void CreatTiles(CollectCode code)
            {
                string TileSquare150x150Image = @"ms-appx:///Assets/SmallLogo.scale-240.png";
                string TileSquare310x150Image = @"ms-appx:///Assets/WideLogo.scale-240.png";
                XmlDocument tileXML = new XmlDocument();
                ////////////////////////////////////////////////////////
                // Find all the available tile template formats at:
                //      http://msdn.microsoft.com/en-us/library/windows/apps/Hh761491.aspx
    
                string tileString = "<tile>" +
                  "<visual version="2">" +
                  "<binding template="TileSquare150x150PeekImageAndText03" fallback="TileSquarePeekImageAndText03">" +
                      "<image id="1" src="" + TileSquare150x150Image + "" alt="alt text"/>" +
                      "<text id="1">" + code.Title + "</text>" +
                       "<text id="2">" + code.Subtitle + "</text>" +
                    "</binding>" +
                    "<binding template="TileWide310x150PeekImage01" fallback="TileWidePeekImage01">" +
                      "<image id="1" src="" + TileSquare310x150Image + "" alt="alt text"/>" +
                      "<text id="1">" + code.Title + "</text>" +
                      "<text id="2">" + code.Subtitle + "</text>" +
                    "</binding>" +
                  "</visual>" +
                "</tile>";
                tileXML.LoadXml(tileString);
                //新建磁贴通知
                TileNotification tile = new TileNotification(tileXML);
                //更新磁贴通知
                TileUpdater updateTiler = TileUpdateManager.CreateTileUpdaterForApplication();
                
                updateTiler.EnableNotificationQueue(false);
                updateTiler.Clear();
                updateTiler.Update(tile);
            }
        }
    ...
    public sealed class CollectCode
        {
            public CollectCode(String uniqueId, String title, String subtitle, int count)
            {
                this.UniqueId = uniqueId;
                this.Title = title;
                this.Subtitle = subtitle;
                this.Count = count;
            }
            public string UniqueId { get; set; }
            public string Title { get; set; }
            public string Subtitle { get; set; }
            public int Count { get; set; }
        }

    至此backgroundtask已经全部准备好。

    step3:在应用中注册相应的backgroundtask

    首先要在Package.appxmanifest清单上声明后台任务,如下图:

    然后再在应用上代码注册后台任务。在51单片机汇编上,我在App.xaml.cs注册后台任务,C#代码如下:

     protected async override void OnLaunched(LaunchActivatedEventArgs e)
            {
    ...
    // 确保当前窗口处于活动状态
                Window.Current.Activate();
                       
                Init();
            }
     private async void Init()
            {
                await BackgroundTaskHelper.Register();
    
            }
    ....
     public sealed class BackgroundTaskHelper
        {
            static string taskName = "BackgroundTask";
            static string taskEntryPoint = "BackgroundTask.HubAppBackgroundTask";
            public static async Task<bool> Register(Action action = null)
            {
                try
                {
                    UnRegister();
    
                    // do the registeration
                    // check access permission
                    BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();
                    switch (status)
                    {
                        case BackgroundAccessStatus.Denied: // reach maxmium number, or, disabled by user
                            return false;
                        case BackgroundAccessStatus.Unspecified:
                            return false;
                        case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity:
                            break;
                    }
    
                    // register the task in the next step.
                    BackgroundTaskBuilder builder = new BackgroundTaskBuilder();
                    builder.Name = taskName;
                    builder.TaskEntryPoint = taskEntryPoint;
                    builder.SetTrigger(new TimeTrigger(15, false)); // run every 15 minutes
    
                    var registration = builder.Register();
    
                    if (registration != null && action != null)
                    {
                        registration.Completed += (s, a) =>
                        {
                            action();
                        };
                    }
    
    
                    return true;
                }
                catch
                {
                    return false;
                }
    
            }
    
            public static bool UnRegister()
            {
                try
                {
                    BackgroundTaskRegistration task = null;
                    // Check for existing registrations of this background task.
                    foreach (var cur in BackgroundTaskRegistration.AllTasks)
                    {
                        if (cur.Value.Name == taskName)
                        {
                            // The task is already registered.
                            task = (BackgroundTaskRegistration)(cur.Value);
                            break;
                        }
                    }
    
                    if (task != null)
                    {
                        task.Unregister(false);
                    }
    
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

    (这个注册后台任务代码,是借鉴博主@MS-UAP http://www.cnblogs.com/ms-uap/ 的应用的代码的-=-)

    至此应用已经可以会在后台动态更新自己的磁贴了。

    三、后话

      昨天更新时登录上windows及windowsphone上的开发中心看了下51单片机汇编的下载情况,还蛮不错的有1000多了(对真正第一开发应用的我来说还是很爽),如图

    没想到的是windows8.1会有700多下载,看来windows8.1平板用户比windowsphone用户还多哈。

    明天又要下广州回学校了=-=大三下学期加油吧!大三再在空余时间开发个什么让自己学习下呢????

  • 相关阅读:
    LeetCode(62)Unique Paths
    4_蒙特卡罗算法求圆周率PI
    CentOS安装sctp协议
    3_寻找假币问题(分治法)
    Gdb调试命令
    高阶函数 -------JavaScript
    方法 -------JavaScript
    函数定义和调用 -------JavaScript
    iterable -------JavaScript
    Map和Set -----JavaScript
  • 原文地址:https://www.cnblogs.com/NEIL-X/p/4305157.html
Copyright © 2011-2022 走看看