Android Splash介面白屏、黑屏問題的解決方案_Android

來源:互聯網
上載者:User

前言

我相信很多Android開發同學都遇到過這樣的需求:

 1.實現一個Splash介面,介面上有應用相關的背景圖片和一個開始按鈕.
 2.點擊按鈕之後進入首頁,以後使用者再開啟應用就不顯示這個Splash介面了. 

也相信很多同學都遇到了這樣的困惑:
 •第二次進入應用,儘管你在Splash介面已經直接跳轉到首頁了,但是還是有個白屏或者黑屏或者帶ActionBar的白屏閃現一下. 

如果你也遇到這個問題,那就繼續閱讀這篇文章,我帶大家去分析和解決這個問題.

解決方案

這裡我們先給出解決方案,然後再具體分析產生原因哈.避免分析的大段文字阻礙了同學學習的熱情.

解決方案非常簡單,一句話概括是:給Splash Activity設定一個主題,主題內容是:全屏+透明.

style.xml增加SplashTheme主題:

<style name="SplashTheme" parent="AppTheme">  <item name="android:windowFullscreen">true</item>  <item name="android:windowIsTranslucent">true</item></style>

AndroidManifest.xml中為SplashActivity配置主題:

<activity android:name=".activity.SplashActivity"  android:theme="@style/SplashTheme">  <intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" />  </intent-filter></activity>

經過如上配置,困擾你的白屏、黑屏、ActionBar屏應該都已經煙消雲散了.為了知其然,並知其所以然,希望同學能繼續跟我一起分析一下這些白屏產生的原因.

Activity組件的視窗啟動過程

首先聲明,本段內容大量參考了羅昇陽老師的部落格。為了方便理解,對其內容進行了壓縮。如果侵權,我立刻刪掉這段分析哈。

想要瞭解白屏產生的根源,就不得不去跟蹤Activity組件的視窗啟動過程。Activity組件在啟動的過程中,會調用ActivityStack類的成語函數startActivityLocked方法。注意,在調用ActivityStack類的成語函數startActivityLocked方法的時候,Activity組件還處於啟動過程中,即它的視窗尚未顯示出來,不過這時候ActivityManagerService服務會檢查是否需要為正在啟動的Activity組件顯示一個啟動視窗。如果需要的話,那麼ActivityManagerService服務就會請求WindowManagerService服務為正在啟動的Activity組件設定一個啟動視窗(ps:而這個啟動視窗就是白屏的由來)。

1. ActivityStack.startActivityLocked

public class ActivityStack {  // set to false to disable the preview that is shown while a new activity  // is being started.  static final boolean SHOW_APP_STARTING_PREVIEW = true;  private final void startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume) {    final int NH = mHistory.size();    int addPos = -1;    // Place to new activity at top of stack, so it is next to interact    // with the user.    if (addPos < 0) {      addPos = NH;    }    // Slot the activity into the history stack and proceed    mHistory.add(addPos, r);    if (NH > 0) {      // We want to show the starting preview window if we are      // switching to a new task, or the next activity's process is      // not currently running.      boolean showStartingIcon = newTasks;      ProcessRecord proc = r.app;      if (proc == null) {        proc = mService.mProcessNames.get(r.processName, r.info.applicationInfo.uid);      }      if (proc == null || proc.thread == null) {        showStartingIcon = true;      }    }  }}

未完待續…希望大家繼續關注。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.