Android高级进阶之-性能优化-黑白屏问题

启动优化

优化思路:
APP通过ActivityThread开始,调用Application.onCreate(),再调用到Activity.onCreate(),之后用户才能看见程序界面。所以根本的优化思路就是减少这些onCreate()方法的耗时。

1.黑白屏问题

 <application
        android:theme="@style/AppTheme">

如果这里的theme继承自Theme.AppCompat.Light,

<style name="AppTheme" parent="Theme.AppCompat.Light">

那么APP启动的时候就是白屏,否则就是黑屏。不论是黑屏或白屏,如果没有处理,都是有问题的。

2.优化方案
减少onCreate()方法执行时间,但也不可避免存在间隙黑白屏。所以有两种方案:1.想办法把黑白屏替换成我们自己的过渡屏幕。2.首屏Activity加载完成之前,不显示程序界面,造成系统启动慢,而不是APP启动慢的假象。

方案一实现:
我们跟踪系统默认主题

  <style name="AppTheme" parent="Theme.AppCompat.Light">

向上可以找到

 <style name="Platform.AppCompat.Light" parent="android:Theme.Holo.Light">
        <item name="android:windowBackground">@color/background_material_light</item>
</style>

发现有一个配置是

<item name="android:windowBackground">@color/background_material_light</item>

因此,我们可以在LauncherActivity的主题中,重写android:windowBackground为自己的资源即可。

<style name="SplashActivityTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/bg_splash</item>
</style>
      <activity
            android:name=".SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/SplashActivityTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

这种方式有一个需要注意的地方,如果设置了android:windowBackground的Activity不被销毁,它指向的资源就会一直占用内存,甚至导致后期的过度绘制,所以这种情况下,我们还需要在该Activity的setContentView()之前设置windowBackground为空或透明:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.getWindow().getDecorView().setBackground(new ColorDrawable(Color.TRANSPARENT));
        setContentView(R.layout.activity_splash);
    }

方案二实现:
同上,我们发现theme还有一个配置:

<item name="android:windowDisablePreview">false</item>

如果把它设置为true,就可以取消Activity的预览。我们只给首页Activity指定这个配置即可。

<style name="SplashActivityTheme" parent="AppTheme">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowDisablePreview">true</item>
</style>
      <activity
            android:name=".SplashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/SplashActivityTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自一触即发 App启动优化最佳实践 一触即发 App启动优化最佳实践 文中的很多图都是Google性能优化指南...
    CP9阅读 3,712评论 0 3
  • 大家都遇到过自己 app 启动时间有些长,屏幕白屏的问题吧。一个正常的商业 app 在启动时时会加载一大票组件的初...
    前行的乌龟阅读 8,796评论 0 14
  • 启动优化的目的 APP启动如果得到很好的优化,增强用户体验增加用户流量;如果app启动时间过长影响用户体验,从而会...
    安仔夏天勤奋阅读 4,572评论 0 1
  • 1. 冷启动与热启动 通常我们在使用某个应用程序时,都是点击桌面应用图标来启动该程序。你肯定或多或少的碰到过这种情...
    云飞扬1阅读 14,182评论 11 57
  • 说到安卓性能优化,这个话题实在是很广,之前在上上一家公司专门搞了一段时间的优化,发现APP的各个方面都得到性能上的...
    gogoingmonkey阅读 4,733评论 0 13