管理中心

进入应用时一直停留在启动页

问题现象

进入应用时,一直停留在启动页,无法进入应用。

背景知识

  • Video:用于播放视频文件并控制其播放状态的组件。
  • onFinish:播放结束时触发该事件,支持attributeModifier动态设置属性方法。
  • 组件可见区域变化事件:组件可见区域变化事件是组件在屏幕中的显示区域面积变化时触发的事件,提供了判断组件是否完全或部分显示在屏幕中的能力,适用于广告曝光埋点之类的场景。

问题定位

  1. 在hilog日志中搜索关键字app cold start,在17:51:34应用冷启动结束,应用发生故障的时间点是17:51:48,需要排查在这段时间之内应用经历的生命周期。
    收起
    自动换行
    深色代码主题
    复制
    1. 05-06 17:51:34.771 14900 14958 I C03F00/com.hx.example/ArkCompiler: [gc] SmartGC: app cold start just finished
  2. 搜索关键字JsUIAbility call js,应用在17:51:32切换到前台,在17:51:36因为侧滑手势切换到后台,在17:51:49通过热启动切换到前台。
    收起
    自动换行
    深色代码主题
    复制
    1. 05-06 17:51:32.867 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onCreate
    2. 05-06 17:51:32.875 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onWindowStageCreate
    3. 05-06 17:51:32.878 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onForeground
    4. 05-06 17:51:36.143 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onBackPressed
    5. 05-06 17:51:36.151 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onBackground
    6. 05-06 17:51:36.881 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onNewWant
    7. 05-06 17:51:36.882 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onForeground
    8. 05-06 17:51:45.977 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onBackground
    9. 05-06 17:51:49.731 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onNewWant
    10. 05-06 17:51:49.738 14900 14900 I C01332/com.hx.example/UIAbility: [js_ui_ability.cpp:1568]JsUIAbility call js, name: onForeground
  3. 应用启动页在正常情况下会播放视频,视频播放结束后会跳转到主页,在异常场景下视频未播放完成,对比正常的日志,在视频播放结束后会产生日志video finish。
    收起
    自动换行
    深色代码主题
    复制
    1. 07-11 09:32:42.256 64899-64899 com.hx.example I video finish., %{public}s
  4. 判断应用监听了Video的onFinish事件,在视频播放结束的回调函数中跳转到主页。在首次冷启动情况下,若用户在视频播放完成前通过侧滑操作将应用退至后台,后续热启动时视频将无法继续播放,导致onFinish事件无法被正确触发。

分析结论

启动页视频未播放结束就退出应用到后台,视频暂停,后续热启动视频不会继续播放,无法触发页面跳转逻辑,导致无法进入应用。

修改建议

监听组件可见区域变化事件,在Video组件重新可见时继续播放视频。

收起
自动换行
深色代码主题
复制
  1. @Entry
  2. @Component
  3. export struct VideoPage {
  4. videoSrc: Resource = $rawfile('TestVideo.mp4'); // 替换为启动页视频
  5. controller : VideoController = new VideoController();
  6. build() {
  7. Column() {
  8. Video({
  9. src : this.videoSrc,
  10. controller: this.controller
  11. })
  12. .autoPlay(true)
  13. .loop(false)
  14. .objectFit(ImageFit.Contain)
  15. .onFinish(() => {
  16. // 此处执行页面跳转
  17. })
  18. .onVisibleAreaChange([0.0, 1.0], (isExpanding: boolean, currentRatio: number) => {
  19. // 当Video组件全部可见时,继续播放
  20. if (isExpanding || currentRatio >= 1.0) {
  21. console.info('Test Video is fully visible.');
  22. this.controller.start();
  23. }
  24. // 当Video组件不可见时,暂停播放
  25. if (!isExpanding && currentRatio <= 0.0) {
  26. console.info('Test Video is completely invisible.');
  27. this.controller.pause();
  28. }
  29. })
  30. }
  31. .height('100%')
  32. .width('100%')
  33. .justifyContent(FlexAlign.Center)
  34. }
  35. }