在Android 11.0和12.0系统中,进入默认Launcher前出现2秒的黑屏问题,可能由多种因素导致。以下是一些针对此问题的解决办法:
一、优化Launcher的启动过程
- 减少Launcher的onCreate方法中的耗时操作:
- Launcher的mainActivity的onCreate方法中可能包含一些耗时的操作,这些操作会延长Launcher的启动时间,从而导致黑屏。可以将这些耗时操作放到子线程中执行,或者优化这些操作的执行效率。
- 设置启动画面:
- 创建一个启动画面的布局文件,并在应用程序的主题中设置该启动画面。当Launcher启动时,首先显示启动画面,然后再切换到Launcher的主界面。这可以掩盖部分黑屏时间,提升用户体验。
二、调整系统开机动画的结束时间
- 延迟开机动画的结束时间:
- 在开机动画的代码中,增加一个标志位来控制开机动画的结束时间。当Launcher显示第一个窗口时,再结束开机动画。这可以确保开机动画在Launcher完全启动后再结束,避免黑屏现象。
- 修改WindowManagerService的相关代码:
- 在WindowManagerService中,调整与开机动画结束相关的代码逻辑。确保在Launcher启动并显示第一个窗口后,再调用相关方法结束开机动画。
三、处理FallbackHome导致的黑屏问题
- 了解FallbackHome的作用:
- FallbackHome是原生Android设置中的一个Activity,它配置了DirectBoot模式。在Launcher启动之前,系统会先启动FallbackHome。如果用户未解锁设备,FallbackHome会一直显示,直到收到ACTION_USER_UNLOCKED广播后再启动Launcher。
- 优化FallbackHome的启动逻辑:
- 如果产品不需要锁屏功能,可以考虑将Launcher设置为DirectBoot模式,从而让Launcher优先加载启动,避免FallbackHome导致的黑屏时间。
涉及代码
frameworks\base\cmds\bootanimation\BootAnimation.cpp
frameworks\base\services\core\java\com\android\server\wm\WindowManagerService.java
frameworks\base\services\core\java\com\android\server\am\ActivityRecord.java