首先说开发中最明显的启动时“黑白屏”的问题并提供解决方案。“黑白屏”就是点击应用图标在启动过程中黑屏或者白屏一两秒的问题。
方案1(推荐,qq貌似就是这种启动方案,不过在启动优化的其他方面处理的好,时间更短了,文末会说启动过程。其他优化以后整理好了再写,先解决问题。)
1、在styles.xml中写一个SplashTheme,完整代码如下:
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
2、在manifest的启动activity加入该主题,下面附启动activity的完整声明:
<activity
android:name=".ui.account.SplashActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@style/SplashTheme" //这一行是关键代码>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
结束,就这么简单。下面解释一下为什么这么写,看源码的话会发现“黑白屏”问题的根源是windowBackground,我们这里设置windowBackground是透明的 true就解决了,这种方法的启动时间是几百毫秒,而且启动背景透明,用户几乎体验不到。
这里提供Android studio查看启动时间的方法:通过关键字 Displayed 并筛选为 No Filters
方案2(闪屏图片放在主题中):
1、在drawable中建资源文件:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<bitmap android:src="@mipmap/app_theme_bg"
android:gravity="fill"/>
</item>
</layer-list>
2、在styles.xml中写一个SplashTheme(同方案1),完整代码如下:
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@drawable/app_theme_bg</item>
</style>
结束。下面说一下方案二的优缺点:
优点:
1、连几百毫秒的透明启动页没有,直接出现启动图。
缺点:
1、主题用图片和SplashActivity的就重复了,主题的图片根据不同的机型会拉伸,从主题到SplashActivity会很突兀。
2、主题用图片一些机型的底部会有裁剪,比如底部有文字说明,很多大公司的app都有裁剪的情况。
系统启动步骤(来源:https://juejin.im/post/5cc19374e51d456e781f2036):
首先拿到一部 Android 系统的手机打开电源,引导芯片代码加载引导程序 BootLoader 到 RAM 中去执行。
BootLoader 把操作系统拉起来。
Linux 内核启动开始系统设置,找到一个 init.rc 文件启动初始化进程。
init 进程初始化和启动属性服务,之后开启 Zygote 进程。
Zygote 开始创建 JVM 并注册 JNI 方法,开启 SystemServer。
启动 Binder 线程池和 SystemServiceManager,并启动各种服务。