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用户还多哈。

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

时间: 2024-11-08 06:38:19

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

Windows 通用应用尝试开发 “51单片机汇编”总结

一.前言 终于完成windows通用应用“51单片机汇编”,半年前开始玩WindowsPhone开发的第一个真正意义上的App(还很多缺点=_=).开发从1月中旬考完试到今天,期间实习了半个月,玩了几天,算起来基本弄了3个多星期吧.不多说,总结总结. 二.开发数据准备 应用中主要的数据是单片机的汇编指令,我主要用XML文件来储存数据,没有使用SQLLite数据库,数据格式如下图: xml文件的数据是我手输入的,所以这是比较烦的.(可能有更简洁的办法获取数据). 而xml文件每个每个节点对应实例,

51单片机汇编溢出标志OV和进位标志位CY

ORG 0000H MOV A,  #1MOV R0,#126ADD A, R0 NOPEND A R0 A结果 CY A(s) R0(s) A结果(s) OV 1 126 127 0 1 126 127 0 1 127 128 0 1 127 -128 1 1 128 129 0 1 -128 -127 0 1 254 255 0 1 -2 -1 0 1 255 0 1 1 -1 0 0 5 255 4 1 5 -1 4 0 176 176 96 1 -80 -80 96 1 126 1 12

51单片机汇编实现冒泡排序

今天为了复习课本上面的程序,就实地检验了下这个程序,当年可是学过微机原理里的冒泡排序的,结果移植平台后又是如此麻烦,呵呵,网上贴吧,论坛,知道,文库上面拜托你们的程序能不能靠谱点!!! 第一种常见的错误就是程序写的一团糟,天马行空,弄了几个位地址和中间变量,外加两个循环,程序早飞了,真是让我们程序员惭愧啊 第二种错误是由于大多参考课本上题目:将以40H为首地址的N个数据进行排序,然后几十行代码,我怎么能很快知道程序对不呢 ................. 鉴于此,特在我们这个绿色空间下贴上两种

51单片机在win10下的开发

/** * SD Yang * 2015-07-30 * http://weibo.com/atCodeMonkey * */ 首先无论你是不是正版系统win7以上的都可以升级到最新的win10系统,实在不行可以用msdn上的镜像安装,然后通过dos命令激活. win10素来以其兼容性著称,也扬言兼容apk等.暂且不管这些,今天来说一下对于刚开始起步学51单片机的同学在win10下的一些问题. 这是我们推荐的开发环境是 keil + stc烧录工具 + 实验板. keil可以正常安装,但是要注意

windows phone 8.1开发:锁屏提醒

原文出自:http://www.bcmeng.com/lockscreen/ 之前小梦和大家分享了toast通知,磁铁更新,今天小梦和大家分享windows phone 8.1开发中的锁屏提醒.相比toast通知和磁铁更新,锁屏提醒十分简单.锁屏提醒有俩种:数字提醒和字形提醒,在Windows Phone 8.1中,手机锁屏提醒仅支持“警报”和“注意”状态字形以及数字.向手机发送任何其他字形将清除锁屏提醒.其支持字形如下: 状态 字形 XML 无 未显示锁屏提醒 <badge value="

[学习笔记]15个QA让你快速入门51单片机开发

一.C语言相关... 1 Q1:sbit与sfr代表是什么?有什么作用?... 1 Q2:#define OSC_FREQ  22118400L这句宏命令里的“L”是什么意思?... 1 Q3:我粘贴了别人的代码,怎么发现没有unit这个类型?... 1 Q4:为什么好多变量都是char类型?它不是字符类型吗?怎么可以用来计数?    1 Q4.1:51单片机中的char,int,long,float,double各占多少个字节,取值范围多大?    1 Q5:unsigned char dat

51单片机开发资料 keil资料共享

51单片机的资料很多,汇总起来也很麻烦,这是我项目的部分资料,都是老生常谈的东西,还是直接扔资料比较实际,资料都上传到闯客网技术论坛,需要资料可以自己去下载吧,同时关于单片机开发和学习,也建了一个裙,供大家不懂的交流和学习:6①③③7705⑧ 1.何谓单片机 一台能够工作的计算机要有这样几个部份构成:CPU(进行运算.控制).RAM(数据存储).ROM(程序存储).输入/输出设备(例如:串行口.并行输出口等).在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上.而在单片机中

ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)

前言 实现的功能,APP通过SmartConfig给Wi-Fi模块配网并绑定设备,然后通过MQTT远程控制开发板的继电器, 简而言之: 51单片机+ESP8266用AT指令实现实现MQTT,(连接的本人云服务器上的MQTT服务器软件) ESP8266订阅的主题:device/Wi-Fi的MAC地址 ESP8266发布的主题:user/Wi-Fi的MAC地址 下载单片机程序 安装APP 调整拨动开关-51单片机和ESP8266通信 跳线帽 打开APP 选择添加设备 手机连接自家的路由器,输入路由器

2-物联网开发标配方案(51单片机程序介绍+WIFI程序介绍)

上一节  https://www.cnblogs.com/yangfengwu/p/9944438.html 购买云服务器安装MQTT就不用说了,以前写过文章介绍 https://www.cnblogs.com/yangfengwu/p/8758733.html 51单片机程序不再介绍....感觉没有什么介绍的 因为我的几乎所有的串口处理都是一个模子刻出来的 程序有什么不明白的上面有联系方式 直接说WIFI程序 1,SmartConfig 2,MQTT https://www.cnblogs.c