Android app啟動白屏優化
阿新 • • 發佈:2018-12-30
可以看到啟動的時候會有一個白屏, 如果手機較慢的話, 這個白屏就會持續一段時間, 不太友好.
那麼還有沒有什麼辦法優化呢?
給我們的應用視窗弄一個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長時間的呈現給使用者一個空白的視窗.