Android的冷啓動與熱啓動以及優化方案

熱啓動


定義:

當啓動應用時,後臺已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在後臺,可進入任務列表查看),所以在已有進程的情況下,這種啓動會從已有的進程中來啓動應用,這個方式叫熱啓動。

特點:

熱啓動因爲會從已有的進程中來啓動,所以熱啓動就不會走Application這步了,而是直接走MainActivity(包括一系列的測量、佈局、繪製),所以熱啓動的過程只需要創建和初始化一個MainActivity就行了,而不必創建和初始化Application,

因爲一個應用從新進程的創建到進程的銷燬,Application只會初始化一次。

創建和初始化以及啓動一個Activity的過程可以參照這篇文章:深入探索Activity生命週期以及啓動過程


冷啓動


定義:

當啓動應用時,後臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啓動方式就是冷啓動。

特點:

冷啓動因爲系統會重新創建一個新的進程分配給它,所以會先創建和初始化Application類,再創建和初始化MainActivity類(包括一系列的測量、佈局、繪製),最後顯示在界面上。

windowBackground等屬性設置給MainActivity以及配置Activity層級上的一些屬性、再inflate佈局、當onCreate/onStart/onResume方法都走完了後最後才進行contentView的measure/layout/draw顯示在界面上,所以直到這裏,

應用的第一次啓動纔算完成,這時候我們看到的界面也就是所說的第一幀。所以,總結一下,應用的啓動流程如下:

Application的構造器方法——>attachBaseContext()——>onCreate()——>Activity的構造方法——>onCreate()——>配置主題中背景等屬性——>onStart()——>onResume()——>測量佈局繪製顯示在界面上。


具體的Activity創建和初始化也可以戳:深入探索Activity生命週期以及啓動過程



冷啓動實現APP秒開

冷啓動時間:
冷啓動時間是指用戶從手機桌面點擊APP的那一刻起到啓動頁面的Activity調用onCreate()方法之間的這個時間段

冷啓動時間段內發生的事情:
首先我們要知道當打開一個Activity的時候發生了什麼,在一個Activity打開時,如果該Activity所屬的Application還沒有啓動,那麼系統會爲這個Activity創建一個進程(每創建一個進程都會調用一次Application,所以Application的onCreate()方法可能會被調用多次),在進程的創建和初始化中,勢必會消耗一些時間,在這個時間裏,WindowManager會先加載APP裏的主題樣式裏的窗口背景(windowBackground)作爲預覽元素,然後纔去真正的加載佈局,如果這個時間過長,而默認的背景又是黑色或者白色,這樣會給用戶造成一種錯覺,這個APP很卡,很不流暢,自然也影響了用戶體驗。

優化方案

消除啓動時的白屏/黑屏

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

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

<style name="AppWelcome" parent="AppTheme">
    <item name="android:windowBackground">@mipmap/bg_welcome_start</item>
</style>

					方案1優化後

2、將背景顏色設置爲透明色,這樣當用戶點擊桌面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,解決方案很簡單:
1、讓其Activity集成Activity而不要集成兼容性的AppCompatActivity
2、在onCreate()方法裏的super.onCreate(savedInstanceState)之前設置我們原來APP的Theme

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            setTheme(R.style.AppTheme);
            super.onCreate(savedInstanceState);
    }
}

							方案2優化後

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

  <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>

作者:李晨瑋
鏈接:https://www.jianshu.com/p/03c0fd3fc245
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。

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