## 小程序运行机制
### 前台/后台状态
小程序启动后,界面被展示给用户,此时小程序处于前台状态。
当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开微信时,小程序并没有完全终止运行,而是进入了后台状态,小程序还可以运行一小段时间。
当用户再次进入微信或再次打开小程序,小程序又会从后台进入前台。但如果用户很久没有再进入小程序,或者系统资源紧张,小程序可能被销毁,即完全终止运行。
### 小程序启动
这样,小程序启动可以分为两种情况,一种是冷启动,一种是热启动。
* 冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。
* 热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。
### 小程序销毁时机
通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁。具体而言包括以下几种情形:
* 当小程序进入后台,可以维持一小段时间的运行状态,如果这段时间内都未进入前台,小程序会被销毁。
* 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。在 iOS 上,当微信客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁小程序,并提示用户 「运行内存不足,请重新打开该小程序」。具体策略会持续进行调整优化。建议小程序在必要时使用 [wx.onMemoryWarning](https://www.w3cschool.cn/weixinapp/weixinapp-17k838h9.html) 监听内存告警事件,进行必要的内存清理。
> 基础库 1.1.0 及以上,1.4.0 以下版本: 当用户从扫一扫、转发等入口(场景值为1007, 1008, 1011, 1025)进入小程序,且没有置顶小程序的情况下退出,小程序会被销毁。
### 启动场景分类
用户打开小程序时,场景可分为以下 A、B 两类:
A. 保留上次的浏览状态。[场景值](https://www.w3cschool.cn/weixinapp/weixinapp-zjwp38ri.html)有以下几项:
| 场景值ID | 说明 |
| --- | --- |
| 1001 | 发现栏小程序主入口,「最近使用」列表(基础库2.2.4版本起包含「我的小程序」列表) |
| 1003 | 星标小程序列表 |
| 1023 | 系统桌面小图标打开小程序 |
| 1038 | 从其他小程序返回小程序 |
| 1056 | 聊天顶部音乐播放器右上角菜单,打开小程序 |
| 1080 | 客服会话菜单小程序入口,打开小程序 |
| 1083 | 公众号会话菜单小程序入口 ,打开小程序(只有腾讯客服小程序有) |
| 1089 | 聊天主界面下拉,打开小程序/微信聊天主界面下拉,「最近使用」栏(基础库2.2.4版本起包含「我的小程序」栏) |
| 1090 | 长按小程序右上角菜单,打开小程序 |
| 1103 | 发现-小程序主入口我的小程序,打开小程序 |
| 1104 | 聊天主界面下拉,从我的小程序,打开小程序 |
| 1113 | 安卓手机负一屏,打开小程序 |
| 1114 | 安卓手机侧边栏,打开小程序 |
| 1117 | 后台运行小程序的管理页中,打开小程序 |
* 若进入的场景中带有 path,则每次打开小程序时都进入对应的 path 页面
* 若进入的场景中不带 path:若小程序是热启动,则保留原来状态若小程序是冷启动,则遵循下一节的重启策略,可能是首页或上次退出的页面
B. relaunch 到指定页或首页
包括除 A 类外的其他场景
* 若进入的场景中带有 path,则每次点击时都进入对应的 path 页面
* 若进入的场景中不带 path,则每次进入都打开首页
### A 类场景的重新启动策略
> 基础库 2.8.0 开始支持,低版本需做[兼容处理](https://www.w3cschool.cn/weixinapp/compatibility.html?RECACHE=1)。
小程序被销毁后,下次冷启动如果属于 B 类场景,将会进入特定的页面。
下次冷启动如果属于 A 类场景,默认情况下将会进入小程序的首页。在页面对应的 json 文件中(也可以全局配置在 app.json 的 window 段中),指定 restartStrategy 配置项可以改变这个默认的行为,使得从某个页面退出后,下次 A 类场景的冷启动可以回到这个页面。
代码示例:
~~~
{
"restartStrategy": "homePage"
}
~~~
restartStrategy 可选值:
| 可选值 | 含义 |
| --- | --- |
| homePage | (默认值)如果从这个页面退出小程序,下次将从首页冷启动 |
| homePageAndLatestPage | 如果从这个页面退出小程序,下次冷启动后立刻加载这个页面,页面的参数保持不变(不可用于 tab 页) |
注意:即使不配置为 homePage ,小程序如果退出过久(当前默认一天时间,可以使用退出状态来调整),下次冷启动时也将不再遵循 restartStrategy 的配置,而是直接从首页冷启动。
无论如何,页面中的状态并不会被保留,如输入框中的文本内容、 checkbox 的勾选状态等都不会还原。如果需要还原或部分还原,需要利用退出状态。
### 退出状态
每当小程序可能被销毁之前,页面回调函数 onSaveExitState 会被调用。如果想保留页面中的状态,可以在这个回调函数中“保存”一些数据,下次启动时可以通过 exitState 获得这些已保存数据。
代码示例:
~~~
{
"restartStrategy": "homePageAndLatestPage"
}
~~~
~~~
Page({
onLoad: function() {
var prevExitState = this.exitState // 尝试获得上一次退出前 onSaveExitState 保存的数据
if (prevExitState !== undefined) { // 如果是根据 restartStrategy 配置进行的冷启动,就可以获取到
prevExitState.myDataField === 'myData'
}
},
onSaveExitState: function() {
var exitState = { myDataField: 'myData' } // 需要保存的数据
return {
data: exitState,
expireTimeStamp: Date.now() + 24 * 60 * 60 * 1000 // 超时时刻
}
}
})
~~~
onSaveExitState 返回值可以包含两项:
| 字段名 | 类型 | 含义 |
| --- | --- | --- |
| data | Any | 需要保存的数据(只能是 JSON 兼容的数据) |
| expireTimeStamp | Number | 超时时刻,在这个时刻后,保存的数据保证一定被丢弃,默认为 (当前时刻 + 1 天) |
注意事项:
* 如果超过 expireTimeStamp ,保存的数据将被丢弃,且冷启动时不遵循 restartStrategy 的配置,而是直接从首页冷启动。
* expireTimeStamp 有可能被自动提前,如微信客户端需要清理数据的时候。
* 在小程序存活期间, onSaveExitState 可能会被多次调用,此时以最后一次的调用结果作为最终结果。
* 在某些特殊情况下(如微信客户端直接被系统杀死),这个方法将不会被调用,下次冷启动也不遵循 restartStrategy 的配置,而是直接从首页冷启动。
- 惠惠软件-开发自助学习系统
- 一.微信公众号(服务号)申请流程
- 二.申请所需提前准备资料
- 三.认证微信公众号:申请微信小程序流程
- 四.微信小程序安装和开发环境
- 五.微信小程序如何上传、提交审核、发布操作
- 六.微信小程序开发教程手册
- 0.1微信小程序 小程序简介
- 0.2微信小程序 开始第一步
- 0.3微信小程序 小程序代码构成
- 0.4微信小程序 小程序宿主环境
- 0.5微信小程序 小程序协同工作和发布
- 0.6微信小程序 目录结构
- 0.7微信小程序 全局配置
- 0.8微信小程序 页面配置
- 0.9微信小程序 sitemap配置
- 0.10微信小程序 场景值
- 0.11微信小程序 注册小程序
- 0.12微信小程序 注册页面
- 0.13微信小程序 页面生命周期
- 0.14微信小程序 页面路由
- 0.15微信小程序 模块化
- 0.16微信小程序 API
- 0.17微信小程序 运行环境
- 0.18微信小程序 JavaScript支持情况
- 0.19微信小程序 运行机制
- 0.20微信小程序 更新机制
- 0.21微信小程序 广告·Banner 广告
- 0.22微信小程序 安全指引·开发原则与注意事项
- 0.23微信小程序 调试
- 0.24微信小程序 启动性能
- 0.25微信小程序 运行时性能
- 0.26微信小程序 性能分析工具
- 0.27微信小程序 体验评分
- 八.小程序的美工
- 8.1图片大小
- 8.2颜色代码
- 8.3小程序的美工技巧
- 九.微信小程序-定制开发
- 十.微信支付申请流程
- 十一.小程序支付对接流程
- 十二.微信小程序使用中常见问题汇总
- 十二.小程序开发中遇到的问题—汇总
- 十四.小程序问题及解决
- 十五.网站开发定制
- 1.开发定制流程
- 2.搭建网站的过程
- 3.做网站基本费用
- 4.服务器选什么系统更好?
- 十六.常用工具、软件网站推荐