根据运行小程序的宿主应用环境不同,小程序也会有不同的启动机制。

#1. 小程序启动

小程序会有两种情况,一种是冷启动,一种是热启动

  • 冷启动:用户首次打开或小程序被宿主应用主动销毁后再次打开的情况,此时小程序需要重新加载启动,即冷启动。
  • 热启动:假如用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时无需重新启动,只需将后台状态的小程序切换到前台,这个过程就是热启动。

#2. 前后台状态

小程序启动后,用户直接可以看到小程序的界面,此时小程序处于前台状态。

当用户点击右上角胶囊按钮关闭小程序,或者按了设备 Home 键离开宿主应用时,小程序并没有直接销毁,而是进入了后台状态;当用户再次打开客户端或再次打开小程序,小程序又会从后台进入前台

#3. 小程序销毁机制

#3.1 移动端

通常,只有当小程序进入后台一定时间,或者系统资源占用过高,才会被销毁,移动端小程序的销毁机制如下:

  • 当小程序占用系统资源过高,可能会被系统销毁或被客户端主动回收。

    • 在 iOS 上,最多允许有 5 个小程序 同时存在,如果超过 5 个会销毁最久未被使用的那个小程序。此外当客户端收到内存告警时,会主动进行所有后台小程序的销毁。
    • 在 Android 上,最多允许有 5 个小程序 同时存在,如果超过 5 个会销毁最久未被使用的那个小程序。此外当内存不足时,系统会直接回收内存,销毁后台长时间未使用的小程序。

#3.2 桌面端

桌面端只要小程序没有关闭,小程序会一直处于运行状态,如果关闭了,会直接销毁。

#4. 小程序打开逻辑

小程序冷启动页面打开逻辑较好理解,热启动较复杂,因为可能会自动产生一些跳转。

根据不同的启动参数,这些跳转可以归纳为:

指定页面或参数不同 效果
清空原来的页面栈,打开指定页
保留原先状态

微信小程序运行机制

1. 小程序的生命周期

小程序从启动到最终被销毁,会经历很多不同的状态,小程序在不同状态下会有不同的表现。

1.1 小程序启动

从用户认知的角度看,广义的小程序启动可以分为两种情况,一种是冷启动,一种是热启动

  • 冷启动:如果用户首次打开,或小程序销毁后被用户再次打开,此时小程序需要重新加载启动,即冷启动。
  • 热启动:如果用户已经打开过某小程序,然后在一定时间内再次打开该小程序,此时小程序并未被销毁,只是从后台状态进入前台状态,这个过程就是热启动。

从小程序生命周期的角度来看,我们一般讲的「启动」专指冷启动,热启动一般被称为后台切前台。

1.2 前台与后台

小程序启动后,界面被展示给用户,此时小程序处于「前台」状态。

当用户「关闭」小程序时,小程序并没有真正被关闭,而是进入了「后台」状态,此时小程序还可以短暂运行一小段时间,但部分 API 的使用会受到限制。切后台的方式包括但不限于以下几种:

  • 点击右上角胶囊按钮离开小程序
  • iOS 从屏幕左侧右滑离开小程序
  • 安卓点击返回键离开小程序
  • 小程序前台运行时直接把微信切后台(手势或 Home 键)
  • 小程序前台运行时直接锁屏

当用户再次进入微信并打开小程序,小程序又会重新进入「前台」状态。

1.3 挂起

小程序进入「后台」状态一段时间后(目前是 5 秒),微信会停止小程序 JS 线程的执行,小程序进入「挂起」状态。此时小程序的内存状态会被保留,但开发者代码执行会停止,事件和接口回调会在小程序再次进入「前台」时触发。

当开发者使用了后台音乐播放、后台地理位置等能力时,小程序可以在「后台」持续运行,不会进入到「挂起」状态

1.4 小程序销毁

如果用户很久没有使用小程序,或者系统资源紧张,小程序会被「销毁」,即完全终止运行。具体而言包括以下几种情形:

  • 当小程序进入后台并被「挂起」后,如果很长时间(目前是 30 分钟)都未再次进入前台,小程序会被销毁。
  • 当小程序占用系统资源过高,可能会被系统销毁或被微信客户端主动回收。
    • 在 iOS 上,当微信客户端在一定时间间隔内连续收到系统内存告警时,会根据一定的策略,主动销毁小程序,并提示用户 「运行内存不足,请重新打开该小程序」。具体策略会持续进行调整优化。
    • 建议小程序在必要时使用 wx.onMemoryWarning 监听内存告警事件,进行必要的内存清理。

基础库 1.1.0 及以上,1.4.0 以下版本: 当用户从扫一扫、转发等入口(场景值为1007, 1008, 1011, 1025)进入小程序,且没有置顶小程序的情况下退出,小程序会被销毁。

2. 小程序冷启动的页面

小程序冷启动时,打开的页面有以下情况

  • (A 类场景)若启动的场景中不带 path

    • 基础库 2.8.0 以下版本,进入首页
    • 基础库 2.8.0 及以上版本遵循「重新启动策略」,可能是首页或上次退出的页面
  • (B 类场景)若启动的场景中带有 path,则启动进入对应 path 的页面

2.1 重新启动策略

基础库 2.8.0 开始支持,低版本需做兼容处理。

小程序冷启动时,如果启动时不带 path(A 类场景),默认情况下将会进入小程序的首页。 在页面对应的 json 文件中(也可以全局配置在 app.json 的 window 段中),指定 restartStrategy 配置项可以改变这个默认的行为,使得从某个页面退出后,下次 A 类场景的冷启动可以回到这个页面。

代码示例:

{"restartStrategy": "homePage"
}

restartStrategy 可选值:

可选值 含义
homePage (默认值)如果从这个页面退出小程序,下次将从首页冷启动
homePageAndLatestPage 如果从这个页面退出小程序,下次冷启动后立刻加载这个页面,页面的参数保持不变(不可用于 tab 页)

注意:即使不配置为 homePage ,小程序如果退出过久(当前默认一天时间,可以使用退出状态来调整),下次冷启动时也将不再遵循 restartStrategy 的配置,而是直接从首页冷启动。

无论如何,页面中的状态并不会被保留,如输入框中的文本内容、 checkbox 的勾选状态等都不会还原。如果需要还原或部分还原,需要利用退出状态

3. 小程序热启动的页面

小程序冷启动时,打开的页面有以下情况

  • (A 类场景)若启动的场景中不带 path,则保留上次的浏览的状态
  • (B 类场景)若启动的场景中带有 path,则 reLaunch 到对应 path 的页面

A 类场景常见的有下列场景值:

场景值ID 说明
1001 发现栏小程序主入口,「最近使用」列表(基础库2.2.4版本起包含「我的小程序」列表)
1003 星标小程序列表
1023 系统桌面小图标打开小程序
1038 从其他小程序返回小程序
1056 聊天顶部音乐播放器右上角菜单,打开小程序
1080 客服会话菜单小程序入口,打开小程序
1083 公众号会话菜单小程序入口 ,打开小程序(只有腾讯客服小程序有)
1089 聊天主界面下拉,打开小程序/微信聊天主界面下拉,「最近使用」栏(基础库2.2.4版本起包含「我的小程序」栏)
1090 长按小程序右上角菜单,打开小程序
1103 发现-小程序主入口我的小程序,打开小程序
1104 聊天主界面下拉,从我的小程序,打开小程序
1113 安卓手机负一屏,打开小程序
1114 安卓手机侧边栏,打开小程序
1117 后台运行小程序的管理页中,打开小程序

4. 退出状态

基础库 2.7.4 开始支持,低版本需做兼容处理。

每当小程序可能被销毁之前,页面回调函数 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 天)

finclip小程序运行机制与微信小程序运行机制相关推荐

  1. uniapp项目在HBuilderX运行自动打开微信小程序

    1,首先在HBuilder X选中项目–运行-选择在微信小程序运行, 2,第一次需要配置一下小程序的安装目录,点击浏览选择对应的目录就可以了,如下图 3,需要在微信你开发小程序–设置–通用设置-打开服 ...

  2. 小程序开发过程中常见问题[微信小程序、支付宝小程序]

    小程序开发过程中常见问题[微信小程序.支付宝小程序] 正文 一.样式中如何使用background-image呢? background-image支持网络的图片链接或者base64 二.使用自适应单 ...

  3. python开发微信小程序-Python 开发者的微信小程序开发实践

    导读 在知乎上,有人提问"如何使用 Python 开发微信小程序". 其实微信小程序作为一个前端的机制,Python 并不能插上边.只不过可以作为后端接口为微信小程序提供数据服务而 ...

  4. 小程序助手多功能微信小程序反编译工具

    介绍: 小程序助手多功能微信小程序反编译工具,软件采用 VS 2017 编译,需安装.net 4.0 或以上版本方可运行,理论上 win7 .win10及以上系统 x86 x64 运行正常,条件有限未 ...

  5. mpvue微信小程序动画_mpvue 与微信小程序的火花

    介绍 项目介绍 WeScale 定位为音乐训练小程序,初期规划了基础音阶的三个训练,以及他们的镜像模式. 数字简谱 字母简谱 数字简谱对字母简谱 后期看情况更新追加其他训练. 产品展示 扫描下方小程序 ...

  6. 从0开发《工程测绘大师》小程序之什么是微信小程序篇(一)

    我们今天来讲讲如何从0开发<工程测绘大师>小程序之什么是微信小程序篇.先来说说什么是微信小程序,什么是微信小程序?为什么会有微信小程序诞生?它到底解决了什么痛点?与传统的网页开发和APP相 ...

  7. IT忍者神龟之小程序最全的微信小程序项目实例

    想玩玩微信小程序的,可以下载个下面的一些demo看一看.(demo下载后,导入到"微信web开发者工具"便可以运行了,顺便把官方微信开发工具下载地址贴一下:下载 · 小程序)注:现 ...

  8. 微信小程序C语言通讯录,微信小程序のwxml列表渲染

    列表渲染存在的意义 以电商为例,我们希望渲染5个商品,而又希望容易改变,我们就要在wxml中动态添加. {{index+1}}:{{item.name}} Page({ data: { message ...

  9. java写微信小程序答辩问题_java微信小程序开发中加密解密算法总结

    详解java微信小程序开发中加密解密算法 一.概述 微信推出了小程序,很多公司的客户端应用不仅具有了APP.H5.还接入了小程序开发.但是,小程序中竟然没有提供Java版本的加密数据解密算法.这着实让 ...

  10. 万能门店小程序_超市门店微信小程序注册流程

    现在超市门店商家利用小程序卖货已经非常普遍,小程序可以便捷地连接线上线下通道,让商家不再局限于门店周围的流量,能够从微信获取更多客户,从而提升销量和店铺知名度.超市要想有自己的线上电商小程序,就得先注 ...

最新文章

  1. Linux字符驱动开发学习总结
  2. C语言再学习 -- 文件
  3. java 持久化线程_java – Spring Hibernate Envers多线程 – 会话关...
  4. 本地数据库与mysql同步软件下载_SyncNavigator数据库同步软件
  5. 【译】为什么我更喜欢对象而不是switch语句
  6. Java – JDK 8的远景
  7. github(5):GitHub的注册与使用(详细图解)
  8. python 编程模型
  9. Java进阶 | 从整体上观察面向对象
  10. java代码安全检测机制_全面解析:java中的反射机制,内含代码验证解析
  11. 我的第一个MFC小项目(4)之 位图转换(续)
  12. 收银怎样挂单和取单_挂单取单(PC收银)
  13. 如何用php 图片合成一张图片,PHP图片处理之多张图片合成一张的实例
  14. 微服务swoft打造腾讯云短信网关
  15. php 英文替换中文,php如何中英文符号替换?
  16. ubuntu使用exiftool查看图片exif信息
  17. C语言制作的讯飞语音合成、识别、唤醒标准调用接口DLL
  18. SLAM前端知识汇总
  19. 信息论 | Shannon编码MATLAB实现
  20. 微信小游戏 - 学习/实践

热门文章

  1. python+pyecharts画地图
  2. 【例题】【高斯消元】USACO3.2.4 Feed Ratios
  3. Mac运行exe的几种方法,欢迎补充!
  4. react大数据量渲染_React大量数据渲染的绝佳解决方案——React虚拟化组件
  5. 百度开晕,中国免费电商模式成定局
  6. 2021年浙大考研计算机专业录取分数线,浙江大学2021年计算机考研拟录取数据分析...
  7. 如何在C#中将 加载、编辑WPS表格?国产控件就能搞定
  8. 2020 DEMO CHINA创新中国春季峰会暨企业创新与企业创投峰会举行
  9. rtx2060什么水平_显卡新秀:RTX2060性能评测
  10. 新版Vue项目配置项目名称-publicPath-前端_v1.0.2