Android Activity啟動優化 白屏/黑屏解決方法


Android Activity啟動優化 白屏/黑屏解決方法

新建一個HelloWorld項目,運行到手機上時,Activity打開之前會有一個動畫,而這個動畫是全白或者全黑的(取決於你的主題是亮還是暗),我們結束進程並點擊桌面上的APP圖標,同樣會出現這個現象。那么為什么會出現這個問題呢?

Activity啟動白/黑屏的原因?

我們所能看到的Activity內容,也就是onCreate()方法中調用setContentView()方法所傳入的自己繪制的layout文件。但是Android系統在啟動一個新的Activity時,首先運行的並不是ContentView,來看看Activity的UI結構:

 Activity的UI結構

  可以看出,一個Activity中在ContentView的外圍還有PhoneWindow、DecorView、TitleView,當Activity進行繪制時會先繪制這三個控件,這時ContentView還沒加載進來,所以什么東西都看不見,系統會將屏幕填充主題默認的背景色,亮系主題填充白色,暗系主題填充黑色,就出現了Activity啟動之前的白/黑現象。

解決方案

上面說了,系統會為屏幕填充主題默認的背景色,那么要解決這個問題就要從屏幕背景下手。這里分兩種情況,一種起始頁是自定義繪制的layout;另一種起始頁是一張圖片,不用在setContentView()加載。

1、起始頁是自定義繪制的layout

將主題背景變成透明的,這樣在ContentView加載出來之前,會透過啟動的Activity看到桌面,就不會又白/黑屏的現象。再把標題欄去掉,把Activity設置成全屏,效果挺不錯。缺點是如果啟動一個有復雜耗時操作的Activity,那么會有一種延遲的感覺。

(1)AndroidManifest.xml中給首頁activity(第一個頁面,一般是歡迎界面)設置自定義的theme

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

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

(2)styles.xml文件中添加以下代碼

<style name="SplashStyle" parent="android:Theme.Light.NoTitleBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowFullscreen">true</item>
</style>

 

2、起始頁是一張圖片,不用在setContentView()加載

  這種是用自定義的StartingWindow來優化。用戶點擊了圖標啟動應用,彈出應用自己定制的StartingWindow,等應用加載好第一幀之后,定制的StartingWindow消失,顯示應用主界面,由於StartingWindow是自己定制的,啟動的時候Decode Bitmap或者Inflate自己定義Layout會有一定的耗時,但是總的來說跟系統默認的差別不大,用戶體驗優。

(1)AndroidManifest.xml中給首頁activity(第一個頁面,一般是歡迎界面)設置自定義的theme

<activity android:name=".MainActivity"
    android:theme="@style/AppTheme.StartingWindowTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

(2)styles.xml文件中添加以下代碼

<!-- 應用啟動頁(StartingWindow)的theme -->
<style name="AppTheme.StartingWindowTheme" parent="AppTheme">
    <!-- 可以設置成純顏色(設置一個和Activity UI相似的背景) -->
    <!--<item name="android:windowBackground">@color/startingwindow_bgcolor</item>-->
    <!--也可以設置成一張圖片 -->
    <item name="android:windowBackground">@drawable/eyeequip0</item>
</style>

(3)Activity里面回復原有的樣式

public class MainActivity extends AppCompatActivity {
    private ListDataScreenView mListDataScreenView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.AppTheme);//恢復原有的樣式
        setContentView(R.layout.activity_main);

        mListDataScreenView = findViewById(R.id.list_data_screen_view);
        mListDataScreenView.setAdapter(new ListScreenMenuAdapter(this));
    }
}

 

綜上就是今天的內容,歡迎指出不足!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM