前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >应用出现双activity导致黑屏情况的分析与解决

应用出现双activity导致黑屏情况的分析与解决

原创
作者头像
人力鹿
修改2022-07-06 17:02:34
1.4K0
修改2022-07-06 17:02:34
举报
文章被收录于专栏:卡顿专栏

一、问题描述

在app使用过程中会出现黑屏情况,界面上只有上下控制栏,界面内播放器没有出现,呈现黑屏状态。

机型:红米K20 Pro,荣耀x10,OPPO,三星折叠屏等部分机型必现

225版本无此问题,230版本引入该问题

问题的TAPD单:

http://tapd.oa.com/TencentVideoSubmarine/bugtrace/bugs/view/1020426608094629409

复现路径:

1、在应用商店下载片多多 2、于商店的页面中点击“打开” 3、进入应用后点击登录,跳转到微信后,不登录(此时微信登录界面覆盖在片多多界面上),随后按home键返回桌面 4、点击桌面上的片多多icon进入,即出现黑屏无法播放视频

二、问题分析

该问题通过稳定复现路径所dumpsys出的activity的任务栈如下:

从问题栈中可以得出如下结论:

1、HomeActivity在该任务栈内有2个对象实例(相当于是叠在了一起),且来自于不同的UID启动

2、启动了第二个HomeActivity的原因在于,拉起微信登录后,有一个WXFastEntryActivity在HomeActivity上面,且由于HomeActivity的加载模式是SingleTop,导致通过新UID拉起HomeActivity会新建一个。

从这里可以看到,HomeAcitivity产生了2个对象实例,此时按系统导航栏上的返回键,消灭第一个activity,会漏出第二个activity,而第二个activity可以正常使用,结合起来,可以得出:只是新创建的这个activity是黑屏的。

问题1:主feed的设计是应该只有一个,为什么会出现两个?

问题2:  即使是两个HomeActivity,那么又是如何导致黑屏的?

结合代码进一步分析

这个变量是静态,那么当第二个HomeActivity创建时,onWelcomePageClose被回调后,就不会发送初始化feed流的Message(即主feed播放器未初始化),仅显示黑色的背景,也就是黑屏状态。

那么,此问题其实涉及到了两个修改点:

1、如何不重新创建这个HomeActivity,这样就可以避免重新加载HomeActivity

2、isInitPlayerFeeds静态变量要如何修改,避免重新创建HomeActivity的时候不走初始化主feed的流程

针对问题1(主feed的设计是应该只有一个,为什么会出现两个?):

因为225版本无此问题,230版本出现,最快的方式通过排查patch发现,以下代码被注释:

fixHuaWeiLaunchRepeatBug方法就是解决重新创建HomeActivity的方案,所以这个方法重新启用后,该问题得以被解决,体现在体验上不存在黑屏且系统dumpsys的HomeActivity只有一个。

该函数的示意图如下:

再与当时注释的同学确认这么操作的原因在于,这个fixHuaWeiLaunchRepeatBug的调用会引起另外的问题,复现步骤:

1、通过桌面进入片多多

2、点击主动升级弹窗升级

3、下载完成后自动跳转到系统启动器页,一直点击安装

4、安装完成后打开,此时发现应用没有打开

原因就在于系统接口----Activity#isTaskRoot()有细节坑,它返回的是当前Activity是不是在当前任务栈的栈底,而不是应用栈。

该情况的示意图如下:

在安装完成打开HomeActivity的时候,由于这个huawei的安装器huaweiPackageInstaller的Activity与我们的HomeAcitvity属于同一任务栈,导致isTaskRoot返回了false,最终调用了finish方法导致未打开。

那么,针对这个问题,修改的方案是不仅判定是否属于当前任务栈底,也同时判定应用栈的栈底是否已经有HomeActivity对象,如果有了就finish创建流程,如果没有就新建出来。

该情况的示意图如下:

修改方案:

综上,可以解决通过启动器二次创建HomeActivity的问题。

针对问题2(即使是两个HomeActivity,那么又是如何导致黑屏的):

isInitPlayerFeeds静态变量的问题,由闪屏广告引入(引入时间在225版本之前),修改方案可以将其变更为成员变量,这样遇到非启动器二次创建HomeActivity的时候,主feed能够正常走初始化流程而不被被拦截。

三、问题复盘

该问题是由于未妥善处理fixHuaWeiLaunchRepeatBug方法导致的启动器二次创建,即使修复了isInitPlayerFeeds变量,也会发现,HomeActivity会需要2次back才能退出。

修改问题的时候,需要综合之前的改动通盘考虑后再进行修改,避免问题二次引入

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题描述
  • 二、问题分析
  • 三、问题复盘
相关产品与服务
TAPD 敏捷项目管理
TAPD(Tencent Agile Product Development)是源自于腾讯的敏捷研发协作平台,提供贯穿敏捷研发生命周期的一站式服务。覆盖从产品概念形成、产品规划、需求分析、项目规划和跟踪、质量测试到构建发布、用户反馈跟踪的产品研发全生命周期,提供了灵活的可定制化应用和强大的集成能力,帮助研发团队有效地管理需求、资源、进度和质量,规范和改进产品研发过程,提高研发效率和产品质量。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档