Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

时间:2023-01-06 19:45:13

一、前言

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

 

二、动态磁贴

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

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

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

step2:

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

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

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

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

添加接口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();//必要的
            }

        }
}

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结
其中更新磁贴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清单上声明后台任务,如下图:

Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

然后再在应用上代码注册后台任务。在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多了(对真正第一开发应用的我来说还是很爽),如图Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结Windows 通用应用尝试开发 “51单片机汇编”第二次更新总结

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

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