如何在UWP应用程序退出时能做一些额外事情?

  • 需求
  • 思路
  • 实现
  • 小结
  • 参考

需求

最近在做UWP的项目,其中有这样一个的需求:统计用户使用APP的时长。

思路

在用户打开app的时候,记录一个时间点t1;然后在关闭app的时候记录第二个时间点t2。在APP退出前上传时间差t2-t1。关键问题点是如何知道关掉APP的时刻,也就是说需要知道关掉APP的事件才行。

实现

带着这样的问题,我们就开始在uwp中寻找这样的事件。在uwpCoreApplication类中还真发现有一个貌似满足我们需求的事件,Exiting事件,那我们就赶紧在App.xaml.cs中去处理这个事件。

public App()
{this.InitializeComponent();this.Suspending += OnSuspending;CoreApplication.Exiting += (s, e) =>{Debug.WriteLine("CoreApplication.Exiting");};
}

我们在第7行处加入断点看看程序在关掉app的时候能否跑进来。结果让人比较失望,发现在关闭app的时候,程序并没有执行到断点处。然后查找文档,微软的文档告诉我们“Windows Phone 8,This API is supported in native apps only.”看来此路不通。
于是开始启用面向谷歌编程的能力,发现uwp在Windows 10 Creators Update (10.0.15063.0)之后引入了一个类SystemNavigationManagerPreview,这个类只做一件事情,就是向用户提供了一种能够响应关闭程序的方法。也就是CloseRequested事件。微软的文档告诉我们:在用户点击了标题栏上的X关闭按钮时会触发该事件。同时文档说,要想使用这个事件,需要先开启一个confirmAppClose受限功能。
开启方法如下:
在工程的Package.appxmanifest中添加以下代码。

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"

<rescap:Capability Name="confirmAppClose"/>


受限功能开启后,我们需要在代码中去处理CloseRequested事件。

        public MainPage(){this.InitializeComponent();。 SystemNavigationManagerPreview.GetForCurrentView().CloseRequested += (s, e) =>{var deferral = e.GetDeferral();//Do extra task hereDebug.WriteLine("Do extra task here");deferral.Complete();};}

迫不及待的运行起来,实验证明:在关掉app的时候,output中确实有Do extra task here的日志输出。这说明CloseRequested事件是有效的。
说明:代码var deferral = e.GetDeferral();deferral.Complete();是必须要加的,这让uwp应用程序会确保extra task做完后再退出去。

小结

找到了CloseRequested事件,我们的需求就能够解决了。当然我们还可以在这个事件里面做更多的事情以提升用户体验,比如在关闭APP的时候弹出一个对话框,询问用户是否保存用户数据等等。

程序员的工作就是不断填坑的过程。好记性不如烂笔头,写此博文,记录下自己填坑的过程,避免第二次填坑时仍然填的那么费力。如能帮到有需要的小伙伴,那将是我的荣幸。

Demo代码。

参考

  • special-and-restricted-capabilities(https://docs.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations?redirectedfrom=MSDN#special-and-restricted-capabilities)
  • https://docs.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations?redirectedfrom=MSDN

如何在UWP应用程序退出时能做一些额外事情?相关推荐

  1. 对象序列化(六):应用实例-程序退出时保存状态

    应用序列化技术的一个典型开发场景就是保存应用程序的当前状态,它允许用户暂时中断当前的工作,关闭程序退出,下次重新启动程序时自动恢复上次的工作状态. 示例: 保存窗体颜色和位置的对象: using Sy ...

  2. 自定义Toast、程序退出时Toast也退出、Toast的用法

    当我们在一个应用中用到Toaster来做为提示时,发现这样一个问题,当某个条件服合时,会弹出Toaster的对话框,不停地执行这个条件,会不停进行Toaster.show的显示,执行几次就现示几次,即 ...

  3. android程序退出时回调,关于android:通过刷卡杀死App时的回调

    我有一个涉及导航的应用程序. 如果用户启动导航,则会创建一种"navigationLifecycleManager".它存储在应用程序实例中,以便在配置更改,活动等之间切换时幸免于 ...

  4. C# 程序退出时 杀死进程

    由于代码处理过,防止多开,如果之前的进程没有退出,再次启动小球时,就会程序无法启动的问题,所以在退出后强制再次杀死进程 查看 软件防止多开 #region 小球的右键菜单单击事件/// <sum ...

  5. Python程序退出时执行指定代码

    一:捕获所有的异常 二:采用traceback模块查看异常,需要导入traceback模块,这个方法会打印出异常代码的行号 三:调用atexit import atexit import signal ...

  6. mfc程序退出时删除托盘图标

    在退出函数中加入 nid.hWnd = this-> m_hWnd; nid.uID=IDR_MAINFRAME;     Shell_NotifyIcon(NIM_DELETE,&ni ...

  7. Hadoop的NameNode在启动时都做了哪些事情?源码解析

    目录 1.启动9870端口服务 2.加载镜像文件和编辑日志 3.创建RPC服务 4.对NameNode启动资源检查 5.DataNode心跳超时判断 6.安全模式 以hadoop3.x版本为例 nam ...

  8. 构造函数中new在执行时都做了哪些事情?

    构造函数是一种特殊的函数,主要用于初始化对象,即为对象成员变量赋初始值,它总与new一起使用,我们可以把对象中的一些公共的属性和方法抽离出来,然后封装到这个函数里面 new在执行时会做四件事情: 1. ...

  9. java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)

    监听程序退出事件,主要是用于程序的优雅退出. 下面针对Java.C++在Windows.Linux下的处理分别进行介绍. 1.Java监听程序退出事件 Java本身是跨平台的,不必关系Windows还 ...

最新文章

  1. antd 中 Tree 的使用-默认选中问题
  2. ^l手动换行符 ^p段落标记符 /n/r_/n
  3. 自助建站软件越来越友好,三大优点值得用心体会
  4. php是独立服务吗,使用Sprockets作为PHP应用程序的独立服务
  5. 【渝粤题库】广东开放大学 人力资源管理(本科) 形成性考核
  6. android 相册 标签,在Android标签上,如何在图片下方显示文字?
  7. 漫步最优化四十——Powell法(上)
  8. SQL中DATEADD和DATEDIFF的用法
  9. HTML keygen控件
  10. 【英语学习】【WOTD】sequester 释义/词源/示例
  11. Memcached如何实现高性能批量删除
  12. 影视剪辑,Pr视频剪辑软件,波纹滚动编辑及比例拉伸
  13. 深度学习入门:基于Python的理论与实现——第一章Python入门
  14. Java奖学金评定系统设计与实现
  15. 颗粒粒径分析方法汇总
  16. Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must hav
  17. Allwinner Camlinux的3g驱动移植
  18. 常用的归一化(Normalization) 方法:BN、LN、IN、GN
  19. java 字符界面 curses_Linux终端图形库 Curses简介和实例分析
  20. 当无人机遇上5G,将碰撞出怎样的火花?

热门文章

  1. QT + VS + C++ 《控件的创建与删除》
  2. C++第一次实验(基础班)项目2
  3. php防CC攻击代码
  4. 最轻便的android模拟器,2019年推荐八款最好用安卓模拟器
  5. DxLib做弹幕射击游戏(二)——画一台敌机
  6. Unity优化之GC——合理优化Unity的GC
  7. 微信小程序分享接口卡片图片尺寸比例
  8. [ios版本]AR 现实增强之高通Vuforia
  9. 有坏道的硬盘修复并通过ghost迁移一例
  10. 智慧城市解决方案2021年最新