android 啓動優化

如何減少應用啓動時的耗時

針對冷啓動時候的一些耗時,可以採取以下策略:

1、在Application的構造器方法、attachBaseContext()、onCreate()方法中不要進行耗時操作的初始化,一些數據預取放在異步線程中,可以採取Callable實現。 
2、對於sp的初始化,因爲sp的特性在初始化時候會對數據全部讀出來存在內存中,所以這個初始化放在主線程中不合適,反而會延遲應用的啓動速度,對於這個還是需要放在異步線程中處理。 
3、對於MainActivity,由於在獲取到第一幀前,需要對contentView進行測量佈局繪製操作,儘量減少佈局的層次,考慮StubView的延遲加載策略,當然在onCreate、onStart、onResume方法中避免做耗時操作。

遵循上面三種策略可明顯提高app啓動速度。

優化應用啓動時的體驗

對於應用的啓動時間,只能是儘量的避免一些耗時的、非必要的操作在主線程中,這樣相對可以縮減一部分啓動的耗時,另外一方面在等待第一幀顯示的時間裏,可以加入一些配置以增加體驗,比如加入Activity的background,這個背景會在顯示第一幀前提前顯示在界面上。 對於應用的啓動時間,只能是儘量的避免一些耗時的、非必要的操作在主線程中,這樣相對可以縮減一部分啓動的耗時。

---------------------

消除啓動時的白屏/黑屏: https://www.jb51.net/article/91568.htm 

在用戶點擊手機桌面APP的時候,看到的黑屏或者白屏其實是界面渲染前的第一幀,如果你看懂了文章頭的那2個問題,那麼解決這個問題就非常輕鬆了,無非就是將Theme裏的windowBackground設置成我們想要讓用戶看到的畫面就可以了,這裏有2種做法:

1、將背景圖設置成我們APP的Logo圖,作爲APP啓動的引導,現在市面上大部分的APP也是這麼做的。

?

1

2

3

<style name="AppWelcome" parent="AppTheme">

  <item name="android:windowBackground">@mipmap/bg_welcome_start</item>

</style>


2、將背景顏色設置爲透明色,這樣當用戶點擊桌面APP圖片的時候,並不會"立即"進入APP,而且在桌面上停留一會,其實這時候APP已經是啓動的了,只是我們心機的把Theme裏的windowBackground的顏色設置成透明的,強行把鍋甩給了手機應用廠商(手機反應太慢了啦,哈哈),其實現在微信也是這樣做的,不信你可以試試。

?

1

<style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"/>

透明化這種做法需要注意的一點,如果直接把Theme引入Activity,在運行的時候可能會出現如下異常:

?

1

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

這個是因爲使用了不兼容的Theme,例如我這裏的Activity繼承了AppCompatActivity,解決方案很簡單:

1、讓其Activity集成Activity而不要集成兼容性的AppCompatActivity

2、在onCreate()方法裏的super.onCreate(savedInstanceState)之前設置我們原來APP的Theme

?

1

2

3

4

5

6

7

public class MainActivity extends AppCompatActivity {

  @Override

  protected void onCreate(Bundle savedInstanceState) {

      setTheme(R.style.AppTheme);

      super.onCreate(savedInstanceState);

  }

}

上面的2種做法,我們都需要將Theme引入對應的Activity

?

1

2

3

4

5

6

7

8

9

<activity

  android:name=".app.main.MainActivity"

  android:theme="@style/AppWelcome"

  android:screenOrientation="portrait">

  <intent-filter>

    <action android:name="android.intent.action.MAIN" />

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

  </intent-filter>

</activity>

三、關於啓動優化

上面的做法其實可以達到"秒開"APP的效果,不過確不是真實的速度,在Activity創建過程中其實是會經過一系列framework層的操作,在日常開發中,我們都會去重寫Application類,然後在Application裏進行一些初始化操作,比如存放用戶標識的靜態化TOKEN,第三方SDK的初始化等。

這裏給出幾點建議:

1、不要讓Application參與業務的操作

2、不要在APPlication進行耗時操作,比如有些開發者會在自己的APP裏一系列文件夾或文件(比如我自己),這些I/O操作應該放到"確實該使用的時候再去創建"亦或者是數據庫的一些操作。

3、不要以靜態變量的方式在Application中保存數據等。

當然這是絕對的理想主義,把上面的"不要"2字之前添上"儘量"2字吧,畢竟在實際開發中,這樣做確實會讓我們方便許多。

對了,補充一點,佈局也是很重要的,儘量的去減少佈局的複雜性,佈局深度,因爲在View繪製的過程中,測量也是很耗費性能的。

好了,以上就是Android冷啓動實現APP秒開的全部內容,希望這篇文章的內容對大家日常開發App能有所幫助,如果有疑問可以留言交流。

------------------------------------

https://www.jianshu.com/p/4f10c9a10ac9  Traceview檢測APP的啓動時間,用Service優化,解決啓動黑屏

 

---------------------

一個Android 應用真正啓動慢的原因是在Application 裏面做了耗時的操作。把這些耗時的操作找出來並且new Thread 放到異步線程裏面,那麼問題就解決了。

-------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章