Android性能优化—App启动速度优化 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

Android性能优化—App启动速度优化

发表时间:2020-10-17

发布人:葵宇科技

浏览次数:39

在这里插入图片描述

app启动的白屏黑屏

开发中会在Activity的onCreate()方法中调用setContentView(View)设置该Activity的布局,那么问题就来了,既然我们设置了布局,为什么启动的时候还会白屏或者黑屏而不是显示set的布局呢?下面就一起来剖析一下原因。
当打开一个Activity时,如果这个Activity所属的Application还没有在运行,系统会为这个Activity的创建一个进程(每开启一个进程都会有一个Application,所以Application的onCreate()可能会被调用多次,一个进程调用一次),但进程的创建与初始化都需要时间,在这个动作完成之前,如果初始化的时间过长,屏幕上可能没有任何动静,用户会以为没有点到按钮。所以既不能停在原来的地方又没到显示新的界面,怎么办呢?这就有了StartingWindow(也称之为PreviewWindow)的出现,这样看起来就像Activity已经启动起来了,只是数据内容还没有初始化好。
源码:
启动根Activity时:ActivityStack#startActivityLocked -> showStartingWindow

StartingWindow一般出现在应用程序进程创建并初始化成功前,所以它是个临时窗口,对应的WindowType是TYPE_APPLICATION_STARTING。目的是告诉用户,系统已经接受到操作,正在响应,在程序初始化完成后实现目的UI,同时移除这个窗口。

这个StartingWindow就是白屏黑屏的根本原因,一般情况下开发者会对Application和Activity设置Theme,系统会根据设置的Theme初始化StartingWindow。Window里面的顶层是DecorView,StartingWindow显示一个空DecorView,但是会给这个DecorView应用这个Activity指定的Theme,如果这个Activity没有指定Theme就用Application的(Application是系统要求必须设置Theme)。

在Theme中可以指定窗口的背景,Activity的ICON,APP整体文字颜色等,如果说没有指定任何属性,就会用默认的属性,也就是上文中提到的空DecorView,所以我们的白屏和黑屏和空DecorView息息相关,我们给APP设置的Style就决定了是白屏还是黑屏。

1、如果选择了Black的系列的主题那么Activity跳转的时候就是黑屏:

@android:style/Theme.Black"

2、如果选择了Light的系列的主题那么Activity跳转的时候就是白屏:

@android:style/Theme.Light"

解决办法

方法1.设置背景图Theme
通过设置一张背景图。 当程序启动时,首先显示这张背景图,避免出现黑屏

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:screenOrientation">portrait</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">>@mipmap/splash</item>
        <item name="android:windowIsTranslucent">true</item>        
</style>

方法2.设置透明Theme
通过把样式设置为透明,程序启动后不会黑屏而是整个透明了,等到界面初始化完才一次性显示出来

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  		<item name="android:screenOrientation">portrait</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>      
</style>

两者对比:
第一种:程序启动快,界面先显示背景图,然后再刷新其他界面控件。但如果背景图和要显示的页面风格区别大的话会给用户刷新不同步感觉。
第二种:用户点击我们APP图标后,需要等待2秒左右的时候才会显示contentView。给用户一种APP启动速度慢的假象,其实Activity已经启动了,只是background是透明的,这时候你点击桌面的其他地方是无效的。

方法3.去除PreviewWindow

    <style name="AppStarTheme" parent="AppTheme">
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>

会造成用户点击桌面上的app图标后误以为没有点击的感觉

相关案例查看更多