我们在平时的WP使用过程中,会遇到一个问题

应用在切出,切回后,

  1. 有时候,会显示“正在恢复”,并等待时间较长,才能回到用户切出时候的画面,但是这种情况并非常见,偶尔发生
  2. 有时候,直接回到切出时的画面,反应还蛮迅速的

这是为什么那?

我做了研究,分析如下:

首先,我们看一下WP的生命周期

(详情见:App activation and deactivation for Windows Phone 8)



当应用因为

  1. 用户点击WIN键
  2. 发送短信,跳往WIFI设置,或者其他Task

切出应用后,会触发事件Deactivated,失活,也就是不在前台显示了

然后,

这里是关键

存在两个状态

  1. Dormant
  2. TomeStoned
  1. Dormant
  2.  
  3. When the user navigates forward, away from an app, after the Deactivated event is raised,
  4. the operating system will attempt to put the app into a dormant state.
  5. In this state, all of the applications threads are stopped and no processing takes place,
  6. but the application remains intact in memory. If the app is reactivated from the dormant,
  7. it doesnt need to do anything to re-establish state, because it has been preserved.
  8.  
  9. If new apps are launched after an app has been made dormant,
  10. and these applications requires more memory than is available to provide a good user experience,
  11. the operating system will begin to tombstone dormant applications to free up memory.

休眠

当用户向前导航或导航出应用时,引发 Deactivated 事件后,操作系统将尝试使应用置于休眠状态。在此状态下,应用程序的所有线程均将停止,并且不进行任何处理操作,但应用程序仍完好地保留在内存中。如果应用是从休眠状态重新激活的,则无需执行任何操作来重建状态,因为状态已被保留。

如果在应用进入休眠状态后启动新的应用,这些应用需要更多的内存才能提供出色的用户体验,操作系统将开始逻辑删除休眠的应用以释放内存。

  1. Tombstoned
  2.  
  3. A tombstoned app has been terminated, but the operating system preserves information about its navigation state
  4. and also preserves the state dictionaries the app populated during Deactivated.
  5. The device will maintain tombstoning information for up to five apps at a time.
  6. If an app is tombstoned and the user navigates back to the application,
  7. it will be relaunched and the application can use the preserved data to restore state.

已逻辑删除(即墓碑化)

已终止逻辑删除的应用,但操作系统不仅保留了有关其导航状态的信息,而且还保留了 Deactivated 期间填充应用的状态字典。设备每次最多可维护五个应用的逻辑删除信息。如果在逻辑删除应用之后,用户向后导航至应用程序,则应用程序将会重新启动并使用保留的数据还原状态。

回到问题

应用在切出,切回后,

  1. 有时候,会显示“正在恢复”,并等待时间较长,才能回到用户切出时候的画面,但是这种情况并非常见,偶尔发生
  2. 有时候,直接回到切出时的画面,反应还蛮迅速的

我认为,

这是因为两种不同的状态返回了应用而致:

应用是从休眠状态重新激活的,则无需执行任何操作来重建状态,因为状态已被保留。

于是这样发生了2

应用进入休眠状态后启动新的应用,这些应用需要更多的内存才能提供出色的用户体验,操作系统将开始逻辑删除休眠的应用以释放内存。(这也是为什么低RAM-512MB的机器更容易出现此问题,他更容易进入此流程)

用户进入逻辑删除(墓碑化)后,再返回应用。

于是这样发生了1

但是上面的关于“墓碑化”的描述文字真的是没有解释为什么会产生会导致性能损失,从而显示“正在恢复”并等待

只是指导了一下开发者,应该在墓碑化前后的Deactivated和Actived中保存和恢复一些状态,实在是不负责啊!

因此,我们现在深入墓碑化,会发现墓碑化后返回应用与休眠后返回应用存在不同

休眠后返回应用

墓碑化后返回(请留心Back之后的区别)

相信细心的你也已经看出来了:

从墓碑化状态Back回应用

居然如“开始屏幕”启动程序一样

重新走了一遍

App Constructor

Page Constructor

启动了一个新的app instance

虽然在“正在恢复”等待之后,最终的效果与Dormant-Back一样,都是显示用户切出应用时候的画面!

怪不得Activated 事件,提醒我们要注意以下黄底部分的文字

Activated 事件

当用户返回到休眠或逻辑删除的应用时,将调用 Activated
事件。应用应检查事件参数的 IsApplicationInstancePreserved
属性,以确定应用是从休眠状态返回,还是从逻辑删除状态返回。如果IsApplicationInstancePreserved 为 true,则应用之前处于休眠状态,状态已由操作系统自动保留。若为 false,则应用之前已被逻辑删除,应用应使用状态字典来还原应用程序状态。在执行Activated 事件处理程序期间,应用程序不应执行资源密集型任务(例如,从独立存储或网络资源加载内容),因为这会增加应用程序恢复所用的时间。而是应在加载应用程序之后,在后台线程中执行这些操作。由于在重新激活您的应用时,您在Deactivated
期间保存的状态字典将显示在内存中,您可以用这些字典来还原状态,而避免产生资源密集型文件操作的开销。

我自己的亲身调试经历也告诉我,当打开

调试——项目属性

勾选“在调试且停用时执行逻辑删除”

应用在切出切回后同样显示“正在恢复”

且等待少许时间

才能回到用户切出时候的画面

因此,验证了我的想法

另外,这个问题十分有趣

同样是采用墓碑机制,Windows Phone 8和iOS的多任务性能为什么会有较大的差别?

有兴趣的同学可以看一下

windows phone因为墓碑化导致“正在恢复”的分析的更多相关文章

  1. windows phone 墓碑化(9)

    原文:windows phone 墓碑化(9) 几个术语的理解: 名称 说明 ;        App ap = (App)Application.Current;        // 构造函数    ...

  2. Windows 8 应用开发 - 挂起与恢复

    原文:Windows 8 应用开发 - 挂起与恢复      Windows 8 应用通常涉及到两种数据类型:应用数据与会话数据.在上一篇提到的本地数据存储就是应用层面的数据,包括应用参数设置.用户重 ...

  3. Windows分页文件设置不当导致SQL Server服务被终止

    Windows分页文件设置不当导致SQL Server服务被终止 文章说明 在正式开始验证和测试之前,先介绍Windows分页文件和SQL Server的动态内存管理.下面测试将分为两种测试场景:场景 ...

  4. windows系统与SQL SERVER 2008数据库服务性能监控分析简要

    软件系统性能测试体系流程介绍之windows系统与SQL SERVER 2008数据库服务性能监控分析简要 目前大部分测试人员对操作系统资源.中间件.数据库等性能监控分析都是各自分析各自的监控指标方式 ...

  5. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  6. [转]DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    在CSDN中发现这篇文章,讲解的比较详细,所以在这里备份一个.原文链接:http://blog.csdn.net/breaksoftware/article/details/8167641 DllMa ...

  7. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  8. 使用Django.core.cache操作Memcached导致性能不稳定的分析过程

    使用Django.core.cache操作Memcached导致性能不稳定的分析过程 最近测试一项目,用到了Nginx缓存服务,那可真是快啊!2Gb带宽都轻易耗尽. 不过Api接口无法简单使用Ngin ...

  9. 有效的结构化思维训练,MECE分析法

    MECE原则,表达精准分类与全面性的有效利器 结构化思维的本质就是逻辑,其目的在于对问题的思考更完整.更有条理,它帮助我们一个一个找到线头,理清思路,探求事物之间的相互联系.MECE分析法是一种结构化 ...

随机推荐

  1. vim编辑器的设置文件

    vim配置特点: 1.按F5可以直接编译并执行C.C++.java代码以及执行shell脚本,按“F8”可进行C.C++代码的调试 2.自动插入文件头 ,新建C.C++源文件时自动插入表头:包括文件名 ...

  2. 【POJ2777】Count Color(线段树)

    以下是题目大意: 有水平方向上很多块板子拼成的墙,一开始每一块都被涂成了颜色1,有C和P两个操作,代表的意思是:C X Y Z —— 从X到Y将板子涂成颜色ZP X Y    —— 查询X到Y的板子共 ...

  3. 浅谈c语言代码段 数据段 bss段

    代码段.数据段.bss段 (1)编译器在编译程序的时候,将程序中的所有的元素分成了一些组成部分,各部分构成一个段,所以说段是可执行程序的组成部分. (2)代码段:代码段就是程序中的可执行部分,直观理解 ...

  4. 合并多个excel工作簿

    合并多个Excel工作簿,会出现电话号码以科学计数法显示,如果想要以字符串方式处理,要按如下完整代码 public static void mergeWorkBook() throws Excepti ...

  5. 推荐C/C++常见的面试题目

    http://blog.163.com/bingqingyujie..5/blog/static/75559361201011861958534/ 里面有详细的面试类型

  6. Laravel-高级篇-Artisan

    (慕课网_轻松学会Laravel-高级篇_天秤vs永恒老师_http://www.imooc.com/learn/702) 一.概述 Artisan是Laravel中自带的命令行工具的名称 由强大的S ...

  7. MongoDB[mark]总忘记它们是干啥的

    MongoDB集群包括一定数量的mongod(分片存储数据).mongos(路由处理).config server(配置节点).clients(客户端).arbiter(仲裁节点:为了选举某个分片存储 ...

  8. [Javascript] The JSON.stringify API

    JSON (JavaScript Object Notation) is a standard method to serialize JavaScript objects and is common ...

  9. android 新浪微博客户端的表情功能的实现

    这是一篇好文章,我转来收藏,技术的最高境界是分享. 最近在搞android 新浪微博客户端,有一些心得分享弄android客户端表情功能可以用以下思路1.首页把新浪的表情下载到本地一文件夹种,表情图片 ...

  10. 原生 javascript 学习之 js变量

    1.变量的命名 方法的命名(驼峰命名法) 全部小写 : 单词与单词之间全部下划线 (my_namespace) 大小写混合 : 第一个单词首字母小写其他单词首字母大写. 规则 首字符 英文字母或下划线 ...