目录

应用退到后台再打开时,页面会回到首页

问题现象

应用打开后,点击切换到其他页面,退出到后台,再通过桌面图标打开,会重新启动回到首页。

背景知识

问题定位

  1. 通过日志分析,当应用切到后台,再次点击图标启动时,在onNewWant回调里触发了onWindowStageCreate的回调。
    20016-20016   C04200/com.exa...owSessionImpl   com.exa...demo        I     (1965)OnNewWant: Window
    8153-8153     A00000/com.exa...demo/testTag    hidumper              I     Ability onWindowStageCreate
    20016-20016   C01332/com.exa...demo/UIAbility  com.exa...demo        I     [js_ui_ability.cpp:1401]end, name: onNewWant, time: 1
  2. 对比其他正常的应用,onNewWant不会触发onWindowStageCreate回调。
  3. 编写Demo,重载onNewWant,并在其中调用onWindowStageCreate,问题复现。

    错误效果的演示代码:

    export default class EntryAbility extends UIAbility {
      windowStage: window.WindowStage | null = null;
      // onCreate等回调重载略
      onWindowStageCreate(windowStage: window.WindowStage): void {
        this.windowStage = windowStage;
        windowStage.loadContent('pages/Index', (err) => {
          // ...
        });
      }
      // 此处调用onWindowStageCreate会复现问题所述的效果
      onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
        if (this.windowStage) {
          this.onWindowStageCreate(this.windowStage);
        }
      }

分析结论

应用在onNewWant回调里调用了onWindowStageCreate,当应用在后台再次启动时,会重新加载启动页面,导致该问题。

修改建议

参考官方文档中onNewWant的用法,仅在onNewWant里更新数据和资源,而不调用onWindowStageCreate接口。