如何在UWP应用程序退出时能做一些额外事情?
如何在UWP应用程序退出时能做一些额外事情?
- 需求
- 思路
- 实现
- 小结
- 参考
需求
最近在做UWP的项目,其中有这样一个的需求:统计用户使用APP的时长。
思路
在用户打开app的时候,记录一个时间点t1
;然后在关闭app的时候记录第二个时间点t2
。在APP退出前上传时间差t2-t1
。关键问题点是如何知道关掉APP的时刻,也就是说需要知道关掉APP的事件才行。
实现
带着这样的问题,我们就开始在uwp
中寻找这样的事件。在uwp
的CoreApplication
类中还真发现有一个貌似满足我们需求的事件,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应用程序退出时能做一些额外事情?相关推荐
- 对象序列化(六):应用实例-程序退出时保存状态
应用序列化技术的一个典型开发场景就是保存应用程序的当前状态,它允许用户暂时中断当前的工作,关闭程序退出,下次重新启动程序时自动恢复上次的工作状态. 示例: 保存窗体颜色和位置的对象: using Sy ...
- 自定义Toast、程序退出时Toast也退出、Toast的用法
当我们在一个应用中用到Toaster来做为提示时,发现这样一个问题,当某个条件服合时,会弹出Toaster的对话框,不停地执行这个条件,会不停进行Toaster.show的显示,执行几次就现示几次,即 ...
- android程序退出时回调,关于android:通过刷卡杀死App时的回调
我有一个涉及导航的应用程序. 如果用户启动导航,则会创建一种"navigationLifecycleManager".它存储在应用程序实例中,以便在配置更改,活动等之间切换时幸免于 ...
- C# 程序退出时 杀死进程
由于代码处理过,防止多开,如果之前的进程没有退出,再次启动小球时,就会程序无法启动的问题,所以在退出后强制再次杀死进程 查看 软件防止多开 #region 小球的右键菜单单击事件/// <sum ...
- Python程序退出时执行指定代码
一:捕获所有的异常 二:采用traceback模块查看异常,需要导入traceback模块,这个方法会打印出异常代码的行号 三:调用atexit import atexit import signal ...
- mfc程序退出时删除托盘图标
在退出函数中加入 nid.hWnd = this-> m_hWnd; nid.uID=IDR_MAINFRAME; Shell_NotifyIcon(NIM_DELETE,&ni ...
- Hadoop的NameNode在启动时都做了哪些事情?源码解析
目录 1.启动9870端口服务 2.加载镜像文件和编辑日志 3.创建RPC服务 4.对NameNode启动资源检查 5.DataNode心跳超时判断 6.安全模式 以hadoop3.x版本为例 nam ...
- 构造函数中new在执行时都做了哪些事情?
构造函数是一种特殊的函数,主要用于初始化对象,即为对象成员变量赋初始值,它总与new一起使用,我们可以把对象中的一些公共的属性和方法抽离出来,然后封装到这个函数里面 new在执行时会做四件事情: 1. ...
- java动作监听退出程序_监听获取程序退出事件(Linux、Windows、Java、C++)
监听程序退出事件,主要是用于程序的优雅退出. 下面针对Java.C++在Windows.Linux下的处理分别进行介绍. 1.Java监听程序退出事件 Java本身是跨平台的,不必关系Windows还 ...
最新文章
- antd 中 Tree 的使用-默认选中问题
- ^l手动换行符 ^p段落标记符 /n/r_/n
- 自助建站软件越来越友好,三大优点值得用心体会
- php是独立服务吗,使用Sprockets作为PHP应用程序的独立服务
- 【渝粤题库】广东开放大学 人力资源管理(本科) 形成性考核
- android 相册 标签,在Android标签上,如何在图片下方显示文字?
- 漫步最优化四十——Powell法(上)
- SQL中DATEADD和DATEDIFF的用法
- HTML keygen控件
- 【英语学习】【WOTD】sequester 释义/词源/示例
- Memcached如何实现高性能批量删除
- 影视剪辑,Pr视频剪辑软件,波纹滚动编辑及比例拉伸
- 深度学习入门:基于Python的理论与实现——第一章Python入门
- Java奖学金评定系统设计与实现
- 颗粒粒径分析方法汇总
- Invalid attempt to spread non-iterable instance. In order to be iterable, non-array objects must hav
- Allwinner Camlinux的3g驱动移植
- 常用的归一化(Normalization) 方法:BN、LN、IN、GN
- java 字符界面 curses_Linux终端图形库 Curses简介和实例分析
- 当无人机遇上5G,将碰撞出怎样的火花?