Android app启动白屏优化

来源:互联网 发布:jsp链接数据库 编辑:程序博客网 时间:2024/05/21 12:45

启动白屏
可以看到启动的时候会有一个白屏, 如果手机较慢的话, 这个白屏就会持续一段时间, 不太友好.

那么还有没有什么办法优化呢?

给我们的应用窗口弄一个PlaceHolder

Android最新的Material Design有这么个建议的. 建议我们使用一个placeholder UI来展示给用户直至App加载完毕.
怎么做呢?

给Window加上背景

当App没有完全起来时, 屏幕会一直显示一块空白的窗口(一般来说是黑屏或者白屏, 根据App主题).

这个空白的窗口展示跟主题相关, 那么我们是不是可以从首屏的主题入手呢? 恰好有一个windowBackground的主题属性, 我们来给Splash界面加上一个主题, 带上我们想要展示的背景.

如果UI给你切了一张全屏的闪图,直接用就行了,如果只是给你中间一个logo,那你就要按照下面的方式去做:
做一个logo_splash的背景:

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">    <!-- 底层白色 -->    <item android:drawable="@color/white" />    <!-- 顶层Logo居中 -->    <item>        <bitmap            android:gravity="center"            android:src="@drawable/ic_github" />    </item></layer-list>

弄一个主题:

<style name="SplashTheme" parent="AppTheme">    <item name="android:windowBackground">@drawable/logo_splash</item>    <item name="colorPrimaryDark">@android:color/transparent</item>    <item name="windowActionBar">false</item>    <item name="windowNoTitle">true</item></style>

将一个什么不渲染布局的Activity作为启动屏

写一个什么都不做的SplashActivity.

public class SplashActivity extends BaseActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 注意, 这里并没有setContentView, 单纯只是用来跳转到相应的Activity.        // 目的是减少首屏渲染        if (AppPref.isFirstRunning(this)) {            IntroduceActivity.launch(this);        }        else {            MainActivity.launch(this);        }        finish();    }}

在AndroidManifest.xml中设置其为启动屏, 并加上主题:

<activity  android:name=".ui.module.main.LogoSplashActivity"  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>

最终的效果

让我们来看下最终的效果:
这里写图片描述

相比之前, 呈现给用户的不再是一个白屏了, 带上了logo, 当然这个背景要显示什么, 我们可以根据实际情况来自定义.

这种优化, 对于有些Application内的初始化工作不能移到子线程做的情况, 是非常友好的. 可以避免我们的App长时间的呈现给用户一个空白的窗口.