Android的冷熱啟動

轉載http://www.cnblogs.com/xunzhi/p/5794793.html

一、應用的啟動方式

通常來說,啟動方式分為兩種:冷啟動和熱啟動。

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

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

特點

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

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

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

二、應用的啟動過程

冷啟動啟動流程:當點擊app的啟動圖標時,安卓系統會從Zygote進程中fork創建出一個新的進程分配給該應用,之后會依次創建和初始化Application類、創建MainActivity類、加載主題樣式Theme中的

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

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

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

大致流程如下:

1、點擊桌面圖標,Launcher會啟動程序默認的Acticity,之后再按照程序的邏輯啟動各種Activity

2、啟動Activity都需要借助應用程序框架層的ActivityManagerService服務進程(Service也是由ActivityManagerService進程來啟動的);在Android應用程序框架層中,ActivityManagerService是一個非常重要的接口,

它不但負責啟動Activity和Service,還負責管理Activity和Service。

Step 1. 無論是通過Launcher來啟動Activity,還是通過Activity內部調用startActivity接口來啟動新的Activity,都通過Binder進程間通信進入到ActivityManagerService進程中,并且調用ActivityManagerService.startActivity接口;

Step 2. ActivityManagerService調用ActivityStack.startActivityMayWait來做準備要啟動的Activity的相關信息;

Step 3. ActivityStack通知ApplicationThread要進行Activity啟動調度了,這里的ApplicationThread代表的是調用ActivityManagerService.startActivity接口的進程,對于通過點擊應用程序圖標的情景來說,這個進程就是Launcher了,

而對于通過在Activity內部調用startActivity的情景來說,這個進程就是這個Activity所在的進程了;

Step 4. ApplicationThread不執行真正的啟動操作,它通過調用ActivityManagerService.activityPaused接口進入到ActivityManagerService進程中,看看是否需要創建新的進程來啟動Activity;

Step 5. 對于通過點擊應用程序圖標來啟動Activity的情景來說,ActivityManagerService在這一步中,會調用startProcessLocked來創建一個新的進程,而對于通過在Activity內部調用startActivity來啟動新的Activity來說,這一步是不需要執行的,

因為新的Activity就在原來的Activity所在的進程中進行啟動;

Step 6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity接口,通知相應的進程執行啟動Activity的操作;

Step 7. ApplicationThread把這個啟動Activity的操作轉發給ActivityThread,ActivityThread通過ClassLoader導入相應的Activity類,然后把它啟動起來。

三、冷啟動過程中碰到的白屏黑屏以及優化啟動時間

1、白屏問題 :

android studio升級 2.0之后 加上Instant Run,Instant Run為了能夠讓我們快速部署代碼,背后其實是有一套非常復雜的邏輯的,比如要在APK中建立服務器與Android Studio進行通信,以及代碼差異比對和替換等,在研發過程中可能出現白屏問題,

一般release版的程序是不會出現這種現象的;

如果接下來還會出現白屏問題,可以查看style文件

1

...... true true

加入了兩個屬性,windowIsTranslucent和windowNoTitle,將這兩個屬性都設置成true,就可以讓程序在初始化的時候窗口是透明的,初始化結束后程序主界面才會顯示出來,從而也就完全看不到白屏界面了

2、啟動時間的優化

先測量activity的啟動時間-------Activity的reportFullyDrawn()方法

你就需要調用Activity的reportFullyDrawn()。它將在log里報告從apk初始化(和前面Displayed的時間是一樣的)到reportFullyDrawn() 方法被調用用了多長時間。

reportFullyDrawn()方法顯示的log也是類似這樣:

ActivityManager: Displayed com.Android.myexample/.StartupTiming: +768ms

在4.4上調用reportFullyDrawn()方法會崩潰(但是log還是能正常打印),提示需要UPDATE_DEVICE_STATS權限?,但是這個權限只有系統app才能授權。解決的辦法是這樣調

try{

reportFullyDrawn();

}catch(SecurityException?e){

}

還有一種測量啟動時間的方法也值得一提,那就是screenrecord命令

首先啟動帶—bugreport選項(它可以在frames 中添加時間戳-應該是L中的特性)的screenrecord 命令:

$?adb?shell?screenrecord?--bugreport?/sdcard/launch.mp4

然后點擊app的圖標,等待app顯示,ctrl-C screenrecord, 使用adb pull命令把文件導出到電腦。

$?adb?pull?/sdcard/launch.mp4

現在你可以打開錄制視頻看看發生了什么。你需要一個能逐幀查看的視頻播放器(mac上的Quicktime 就可以,不清楚其它os上什么播放器這個功能最好使)。現在逐幀播放,注意視頻的上方有一個frame 時間戳。

一直往前直到你發現app圖標高亮了為止。這個時候系統已經處理了圖標上的點擊事件,開始啟動app了,記錄下這一幀的時間。繼續播放幀直到你看到了app整個UI的第一幀為止。根據不同情況(是否有啟動窗口,是否有啟動畫面等等),

事件和窗口發生的實際順序可能會有不同。對于一個簡單的app來說,你會首先見到啟動窗口,然后漸變出app真實的UI。在你看到UI上的任何內容之后,你應該記錄下第一幀,這時app完成了布局和繪制,準備開始顯示出來了。同時也記錄下這一幀所發生的時間。

現在把這兩個時間相減 ((UI displayed) - (icon tapped)); 得到app從點擊到繪制就緒的所有時間。雖然這個時間包含了進程啟動之前的時間,但是至少它可以用于跟其他app比較。

Android冷啟動時間優化

冷啟動時間是指當用戶點擊你的app那一刻到系統調用Activity.onCreate()之間的時間段。在這個時間段內,WindowManager會先加載app主題樣式中的windowBackground做為app的預覽元素,然后再真正去加載activity的layout布局

冷啟動時間優化

知道了Android冷啟動時間的原理之后,就可以通過一些小技巧來對冷啟動時間進行優化,從而讓你app加載變得”快“一些(視覺體驗上的快)。我們可制作一個啟動Activity的背景樣式的.9圖片,然后把這個.9圖片做為windowBackground。

圖片制作好之后,我們就可以用它做為app冷啟動階段的預覽元素,如下設置:

為啟動的Activity自定義一個Theme

1

2

3

@drawable/window_background_statusbar_toolbar_tab

將新的Theme應用到設置到AndroidManifest.xml中

1

2

3

4

5

6

7

8

9

android:name=".MainActivity"

android:theme="@style/AppTheme.Launcher">

由于給MainActivity設置了一個新的Theme,這樣做會覆蓋原來的Theme,所以在MainActivity中需要設置回原來的Theme

publicclassMainActivityextendsAppCompatActivity {

@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {//Make sure this line comes before calling super.onCreate().setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,660評論 25 708
  • 最近一直想整理一個關于Android熱啟動,冷啟動的文章,于是就有了下文(本文僅僅只是整理總結前人的知識點)來源:...
    忘塵And閱讀 2,947評論 0 7
  • 【觸發背景】面對海量APP的今天,APP用戶量和活躍度成為評價一款APP是否成功的重要因素。用戶下載APP后,AP...
    siyu8023閱讀 10,353評論 1 14
  • 這是我的夢境記錄者。11.19 出來透氣的時候,欣然看見了那只小狗。 白色的,有點臟兮兮的,像是流浪了一段時間的樣...
    張企鵝閱讀 433評論 0 0
  • 擼起袖子加油干,時刻不忘減肥要! 新年登山享受太陽的力量,太陽賜予我力量吧! 早 中 晚 十年后重游丹霞山
    奔啵兒霸閱讀 298評論 0 0