## 小程序運行機制
### 前臺/后臺狀態
小程序啟動后,界面被展示給用戶,此時小程序處于前臺狀態。
當用戶點擊右上角膠囊按鈕關閉小程序,或者按了設備 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.服務器選什么系統更好?
- 十六.常用工具、軟件網站推薦