Android 11 解决开机动画到Launcher黑屏问题

文章讲述了在Android设备上,由于FallbackHome启动后快速启动Launcher导致开机动画提前退出的问题。解决方案一是将关闭动画的代码移动到Launcher绘制阶段,确保动画在Launcher启动后退出;二是对ActivityTaskManagerService进行修改,延迟enableScreenAfterBoot直到非FallbackHome活动出现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android 是先启动FallbackHome,再启动Launcher,就导致了在Launcher启动之前,开机动画就退出了,产生黑屏现象。关于开机动画的退出流程,请参考:Android 11 开机动画启动流程分析

解决这个问题,思想就是将开机动画延长到Launcher启动后再退出,有两种方案:

  • 将performEnableScreen中的设置关闭开机动画属性的代码移动到Launcher绘制的地方
  • Launcher启动后,再调用WindowManagerService的enableScreenAfterBoot方法,设置mSystemBooted为true,让performEnableScreen继续往下执行,设置关闭开机动画

代码实现

方案一:
在APP绘制的时候,都会调用到ActivityRecord.java的onWindowsDrawn方法,调用栈如下:

onWindowsDrawn shortComponentName:com.android.settings/.FallbackHome
 java.lang.Exception
      at com.android.server.wm.ActivityRecord.onWindowsDrawn(ActivityRecord.java:5419)
      at com.android.server.wm.ActivityRecord.updateReportedVisibilityLocked(ActivityRecord.java:5544)
      at com.android.server.wm.ActivityRecord.onFirstWindowDrawn(ActivityRecord.java:5349)
      at com.android.server.wm.WindowState.performShowLocked(WindowState.java:4438)
      at com.android.server.wm.WindowStateAnimator.commitFinishDrawingLocked(WindowStateAnimator.java:375)
      at com.android.server.wm.DisplayContent.lambda$new$8$DisplayContent(DisplayContent.java:889)
      at com.android.server.wm.-$$Lambda$DisplayContent$qxt4izS31fb0LF2uo_OF9DMa7gc.accept(Unknown Source:4)
      at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:1984)
      at com.android.server.wm.WindowContainer$ForAllWindowsConsumerWrapper.apply(WindowContainer.java:1974)
      at com.android.server.wm.WindowState.applyInOrderWithImeWindows(WindowState.java:4651)
      at com.android.server.wm.WindowState.forAllWindows(WindowState.java:4550)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.ActivityRecord.forAllWindowsUnchecked(ActivityRecord.java:3641)
      at com.android.server.wm.ActivityRecord.forAllWindows(ActivityRecord.java:3636)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.TaskDisplayArea.forAllWindows(TaskDisplayArea.java:488)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1302)
      at com.android.server.wm.WindowContainer.forAllWindows(WindowContainer.java:1319)
      at com.android.server.wm.DisplayContent.applySurfaceChan
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值