App啓動頁面優化

目錄介紹

  • 01.存在白屏問題
    • 1.1 問題描述
    • 1.2 問題分析
  • 02.解決白屏的辦法
    • 2.1 解決方案分析
    • 2.2 第一種解決方案
    • 2.3 第二種解決方案
    • 2.4 注意要點
  • 03.Application啓動速度優化
  • 04.啓動頁面屏蔽返回按鍵

好消息

01.存在白屏問題

1.1 問題描述

  • 出現問題描述
    • android app啓動頁面黑屏的問題,android開發app啓動時若沒有作特殊處理的話,會出現一瞬間的白屏現象。
    • 即便你啓動頁界面就加載一個佈局,不作其餘耗時處理,貌似也會出現一瞬間的白屏問題。注意,有些地方也稱黑屏,主要是看你給app設置的style樣式。
    • 當從桌面 Launcher 的小圖標點擊冷啓動一個 App 的時候,程序須要進行一些基本的初始化操做,例如在Application 或者SplashActivity中作了不少耗時操做,例如初始化第三方SDK等,當手機性能很差,配置不高時,該現象尤爲明顯。

1.2 問題分析

  • 爲何存在這個問題
    • 當系統啓動一個APP時,zygote進程會首先建立一個新的進程去運行這個APP,可是進程的建立是須要時間的,在建立完成以前,界面是呈現假死狀態,因而系統根據你的manifest文件設置的主題顏色的不一樣來展現一個白屏或者黑屏。而這個黑(白)屏正式的稱呼應該是Preview Window,即預覽窗口。
    • 實際上就是是activity默認的主題中的android:windowBackground爲白色或者黑色致使的。
    • 總結來講啓動順序就是:app啓動——Preview Window(也稱爲預覽窗口)——啓動頁

02.解決白屏的辦法

2.1 解決方案分析

  • Android在選擇展現黑屏或者白屏的時候,是根據你設定的主題而不一樣的,也就是說,雖然你的代碼沒有被執行,你的配置文件卻被提早讀取了,用來做爲展現Preview Window界面的依據。因此,解決方案的切入口就是整個APP的manifest文件,更確切的說應該是主題配置文件。
  • 設置配置文件style樣式中的windowBackground這個屬性來顯示一張背景圖還有一個效果就是啓動應用程序會感受很是快,並且與加載MainActivity的contentView是異步的。

2.2 第一種解決方案

  • 解決辦法:給當前啓動頁添加一個有背景的style樣式php

    • 設置style樣式以下
      <style name="SplashTheme" parent="AppTheme">
      <item name="android:windowBackground">@mipmap/splash</item>
      <item name="android:statusBarColor" tools:ignore="NewApi">@color/white</item>
      <item name="android:windowIsTranslucent">true</item>
      </style>
    • 注意,在清單文件中android

      <activity android:name=".SplashActivity"
      android:theme="@style/SplashTheme">
      <intent-filter>
          <action android:name="android.intent.action.MAIN" />
      
          <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
      </activity>
  • 通過處理以後App啓動時就不會出現一瞬間白屏的效果
    • 將主題設置到啓動的Activity的主題中,windowBackground就是即將展現的preview window。其中splash能夠是一整張圖片,它也能夠是一個能解析出圖片資源的XML文件。
  • 該方案注意要點
    • 給Preview Window設置的背景圖若是不作處理,圖片就會一直存在於內存中,因此,當咱們進入到歡迎頁的時候,不要忘了把背景圖設置爲空
      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
      //將window的背景圖設置爲空
      getWindow().setBackgroundDrawable(null);
      super.onCreate(savedInstanceState);
      }
  • 這樣操做如何屏幕適配呢?
    • 這樣經過樣式style設置SplashActivity加載圖,不能像imageView那樣能夠設置縮放功能,所以能夠採用.9圖片。
    • 之前有開發者採用個人這個建議,直接設置圖,沒有作適配,也無傷大雅,具體要看UI要求呢!

2.3 第二種解決方案

  • 禁止加載Preview Window,具體作法以下:
    <style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowDisablePreview">true</item>
    </style>
    • 設定爲啓動的Activity的主題,便可禁止Preview Window,固然,也有人經過把preview window設置爲全透明,也達成了相似的效果。我的感受這種方法沒有第一種好!
  • windowDisablePreview的做用
    • 經過設置android:windowDisablePreview屬性,禁用窗口的預覽動畫,在SplashActivity顯示以前,系統永遠不會使用窗口的主題來顯示它的預覽,這也保證了不會出現白屏或者黑屏。可是,與設置android:windowIsTranslucent屬性同樣,若是在SplashActivity啓動的時候,有過多複雜的操做,就會出如今手機中點擊了應用程序的圖標,但過n秒纔會打開應用程序很差的卡頓體驗效果。
  • 該方案是否有缺點?
    • 這種方法有個小缺點,就是點擊後短暫的那幾百毫秒沒有反應,就好像「假死」了同樣,過了一下子才跳出咱們應用程序的第一個Activity,若是你不想讓你的 App 有這個短暫「假死」時間,建議使用第一種方法。

2.4 注意要點

  • 不論是那種方式,均可以解決問題。注意的是有些手機標題欄和狀態欄也會影響這兩圖層的,形成抖動效果,爲了不這種狀況須要處理狀態欄問題。這裏能夠直接引用我封裝的狀態欄庫,有興趣能夠了解下,直接拿來用:https://github.com/yangchong211/YCStatusBar

03.Application啓動速度優化

  • 提升app的啓動速度,加快Application的執行時間也是一個很重要的方面,這裏我暫時總結了幾條原則:
    • 儘可能不將一些業務邏輯放於Application中;
    • Application儘可能不以靜態變量的方式保存應用數據;
    • 若App的大小不是特別大無需使用dex分包方案;
    • 在Application中關於文件,數據庫等耗時的操做盡可能放到IntentService線程中處理
    • 不要作有關於循環的操做

04.啓動頁面屏蔽返回按鍵

  • 通常App中都會在啓動頁面執行一些初始化配置等,因此這時候啓動頁加載時不但願用戶經過按下返回按鍵退出App,於是能夠在啓動頁中屏蔽返回按鍵,這裏簡單的介紹一下具體的實現:
    /**
     * Activity屏蔽物理返回按鈕
     *
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

關於其餘內容介紹

01.關於博客彙總連接

02.關於個人博客

相關文章
相關標籤/搜索