1. 程式人生 > >Android app啟動白屏優化

Android app啟動白屏優化

啟動白屏
可以看到啟動的時候會有一個白屏, 如果手機較慢的話, 這個白屏就會持續一段時間, 不太友好.

那麼還有沒有什麼辦法優化呢?

給我們的應用視窗弄一個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長時間的呈現給使用者一個空白的視窗.