1、冷启动和热启动
(1)定义
冷启动:在启动应用时,系统中没有该应用的进程,这时系统会创建一个新的进程分配给该应用;
热启动:在启动应用时,系统中已有该应用的进程;
(2)最直接的理解方式
可以在自定义Application的onCreate方法打印一个日志,启动app,如果打印,就说明是冷启动,如果没有打印,就是热启动。
(3)Recent理解
打开模拟器
image.png下面第三个按钮为Recent键,点击Recent,如果后台没有进程,那么显示为:
image.png此时打开app就是冷启动。
反之,存在历史进程,如图:
image.png此时,打开app,就是热启动。
(4)冷、热启动的本质区别
冷启动:创建进程 --> 启动进程,并初始化 --> 创建JVM虚拟机 --> 初始化通信相关的Service --> 打开Application并将app信息加载到内存 --> 启动Windows窗口 --> 打开Activity并初始化
热启动:打开Activity并初始化
所以,本质上,冷启动的准备工作要比热启动多,所以,如果启动的Activity没有耗时操作的话,热启动几乎可以秒开;
2、冷启动优化
冷启动会导致app打开速度慢,相应的注意点如下:
1、不要在Application中做耗时操作;
2、启动时,子线程不要创建太多;
3、第一启动的Activity中不要做耗时操作;
3、黑白屏问题
1、检查自定义Application是否存在耗时操作,如果存在,需要将耗时操作移到Activity;
假设,自定义Application中存在5秒耗时操作,显示器会停留在Window窗口5秒钟,5秒之后才开始显示Activity。
Window的颜色由Android SDK决定或则由系统决定;
一般情况,但不绝对:
Android 8.0之前(不包括8.0):显示5秒黑屏
Android 8.0之后(包括8.0) :显示5秒白屏
2、黑白屏插入广告
黑白屏和主题息息相关,在Application中设置主题,如下:
<application
...
android:theme="@style/AppTheme">
主题的具体代码:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
....
....
....
</style>
直接看最终父主题,找到windowBackground属性:
<style name="Theme.Light">
....
<item name="windowBackground">@drawable/screen_background_selector_light</item>
....
</style>
查看颜色值:
<drawable name="screen_background_light">#ffffffff</drawable>
当然,有些父主题不一定能找到windowBackground,这时window的颜色完全有系统决定,不由SDK决定;
有些时候,使用SDK主题,SDK主题存在对不同版本的系统做了适配,如图:
image.png
所以,window窗口的主题可能是SDK决定,也有可能是系统决定。
不管是由SDK决定还是系统决定,目前window窗口的颜色只有两种:黑屏和白屏
一般而言,Android 8.0之前(不包括8.0)是黑屏,Android 8.0之后(包括8.0)是白屏,但这也不是绝对的。
与其让Android SDK或者系统来控制window背景色,还不如让app自己来决定,代码如下:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
...
<item name="android:windowBackground">@color/white</item>
</style>
以上代码将window的背景的设置为白色,虽然依然存在白屏问题,但总比黑屏要香。
windowBackground 属性还可以配置一张图片,比如广告,将window的背景设置为广告,这种做法的优缺点如下:
优点:
(1)可以打广告
缺点:
(1)浪费内存,将图片设置为背景是非常消耗内存的,这张图片会永久占用内存;
(2)无法适配,各种各样大小的屏幕大小导致图片容易变形,并且不支持沉浸式;
总之,利用window的间隙打广告是不可取的,如果非要打广告,可以在欢迎页面上做。
3、将window背景设置为透明,解决黑白屏问题
<!--将window背景设置为透明,但直接设置透明颜色不会生效,会导致显示黑屏-->
<style name="AppTheme_Launcher1" parent="AppTheme">
<item name="android:windowBackground">@color/translucent</item>
</style>
如果使用上述代码,将windowBackground设置为透明的颜色值,那么不仅不会生效,还会显示成黑屏。
<!--等待Activity创建完成直接启动Activity-->
<style name="AppTheme_Launcher2" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
</style>
将windowIsTranslucent属性设置为true,等待Activity创建完成直接启动Activity,冷启动打开app时,会发现时间稍微有点长;
将window的背景设置为null,可以节省一些内存的开销,代码如下:
<!--等待Activity创建完成直接启动Activity,将window背景设置为null-->
<style name="AppTheme_Launcher3" parent="AppTheme">
<item name="android:windowBackground">@null</item>
<item name="android:windowIsTranslucent">true</item>
</style>
这种方式会等待Application和Activity初始化完成才会启动Activity,等待的时间特别长,体验特别不好;
最后一种方式是,关闭window预览,Application初始化完成,就可以启动Activity,从体验上比前者好:
<!--关闭window的预览,并将window背景设置为null-->
<style name="AppTheme_Launcher4" parent="AppTheme">
<item name="android:windowBackground">@null</item>
<item name="android:windowDisablePreview">true</item>
</style>
最后,总结下黑白配问题相关知识点:
(1)Application初始化耗时会导致黑白屏;
(2)将windowIsTranslucent设置为true,需要等待Application和Activity初始化完成才会启动Activity;
(3)将windowDisablePreview设置为true,关闭window预览之后,需要等待Application初始化完成,不需要等待Activity初始化完成;
(4)如果Activity中的主线程存在耗时操作,并且Activity的根布局是透明的,这种情况容易导致黑白屏问题;
[完...]
网友评论