借鑑:http://blog.csdn.net/yanzhenjie1003/article/details/52201896?utm_source=tuicool&utm_medium=referral 在閱讀這篇文章以前,首先須要理解幾個東西:java
一、什麼是Android的冷啓動時間? 冷啓動時間是指用戶從手機桌面點擊APP的那一刻起到啓動頁面的Activity調用onCreate()方法之間的這個時間段。android
二、在冷啓動的時間段內發生了什麼? 首先咱們要知道當打開一個Activity的時候發生了什麼,在一個Activity打開時,若是該Activity所屬的Application尚未啓動,那麼系統會爲這個Activity建立一個進程(每建立一個進程都會調用一次Application,因此Application的onCreate()方法可能會被調用屢次),在進程的建立和初始化中,勢必會消耗一些時間,在這個時間裏,WindowManager會先加載APP裏的主題樣式裏的窗口背景(windowBackground)做爲預覽元素,而後纔去真正的加載佈局,若是這個時間過長,而默認的背景又是黑色或者白色,這樣會給用戶形成一種錯覺,這個APP很卡,很不流暢,天然也影響了用戶體驗。數據庫
3.看一下效果之間的對比:圖1、這是未優化 圖2、方案一優化後 圖3、方案二優化後 微信
2、消除啓動時的白屏/黑屏 在用戶點擊手機桌面APP的時候,看到的黑屏或者白屏實際上是界面渲染前的第一幀,若是你看懂了文章頭的那2個問題,那麼解決這個問題就很是輕鬆了,無非就是將Theme裏的windowBackground設置成咱們想要讓用戶看到的畫面就能夠了,這裏有2種作法:app
一、將背景圖設置成咱們APP的Logo圖,做爲APP啓動的引導,如今市面上大部分的APP也是這麼作的。ide
<style name="AppWelcome" parent="AppTheme"> <item name="android:windowBackground">@mipmap/bg_welcome_start</item> </style>
二、將背景顏色設置爲透明色,這樣當用戶點擊桌面APP圖片的時候,並不會"當即"進入APP,並且在桌面上停留一會,其實這時候APP已是啓動的了,只是咱們心機的把Theme裏的windowBackground的顏色設置成透明的,強行把鍋甩給了手機應用廠商(手機反應太慢了啦,哈哈),其實如今微信也是這樣作的,不信你能夠試試。佈局
<style name="Appwelcome" parent="android:Theme.Translucent.NoTitleBar.Fullscreen"/>
透明化這種作法須要注意的一點,若是直接把Theme引入Activity,在運行的時候可能會出現以下異常:優化
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
這個是由於使用了不兼容的Theme,例如我這裏的Activity繼承了AppCompatActivity,解決方案很簡單: 一、讓其Activity集成Activity而不要集成兼容性的AppCompatActivity 二、在onCreate()方法裏的super.onCreate(savedInstanceState)以前設置咱們原來APP的Themeui
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); } }
上面的2種作法,咱們都須要將Theme引入對應的Activitythis
<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>
3、關於啓動優化
上面的作法其實能夠達到"秒開"APP的效果,不過確不是真實的速度,在Activity建立過程當中實際上是會通過一系列framework層的操做,在平常開發中,咱們都會去重寫Application類,而後在Application裏進行一些初始化操做,好比存放用戶標識的靜態化TOKEN,第三方SDK的初始化等。 這裏給出幾點建議: