Android Starting Window(Preview Window)

當打開一個Activity時,若是這個Activity所屬的應用尚未在運行,系統會爲這個Activity所屬的應用建立一個進程,但進程的建立與初始化都須要時間,在這個動做完成以前系統要作什麼呢?若是沒有任何反應的話,若是程序初始化的時間很長,用戶可能還覺得沒有點到相應的位置。但此時所啓動的程序還沒初始化完,既沒法顯示程序,又不能停在原處不作任何動做,怎麼辦?這就有了Starting Window的概念,也能夠稱之爲Preview Windowhtml

Starting Window就是一個用於在應用程序進程建立並初始化成功前顯示的臨時窗口,擁有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前顯示這個窗口,以告知用戶系統已經知道了他要打開這個應用並作出了響應,當程序初始化完成後顯示用戶UI並移除這個窗口。android

這個Starting Window咱們都見過,不過可能沒留意過,其實就是開啓程序時黑屏的那個窗口,夠醜的。不過也沒辦法,每一個程序的界面都不是同的,系統只有默認顯示一個很簡單的窗口了。app

若是所謂的Starting Window只是一個黑屏的窗口的話,那這個功能未免也太雞肋了。其實系統是能夠根據每一個程序的Theme顯示不一樣的樣子的。佈局

啓動應用的時候,雖然咱們的程序還沒初始化,但程序內的組件但是在程序安裝的時候就被系統分析註冊了的。咱們能夠針對每一個Application和Activity設置不一樣的Theme,系統就是根據這個Theme初始化Starting Window的。Window佈局的頂層是DecorView,Starting Window就是顯示一個空的可是應用了Activity指定的Theme(若是Activity沒有指定就用Application的)的DecorView。htm

在Theme中能夠指定不少東西,如ActionBar的樣式,窗口的背景,Activity的圖標等,經過給Activity指定Theme,系統就能夠在咱們的應用初始化完成以前將這個Theme應用到Starting Window,這樣看起來就像咱們的應用已經啓動起來了,只是數據內容尚未初始化好。進程

因此,若是你的Activity的背景只是簡單的純色的話,最好直接經過Theme把它應用到Activity的Background,而不是設置爲頂層Layout的背景,若是真的須要給頂層Layout設置背景,也能夠給android:windowBackground設置一個和Activity UI類似的背景,爲了防止Overdraw,在Activity的onCreate中經過setWindowBackground()再把窗口的背景設置爲null圖片

系統在顯示Activity前顯示一個Starting Window僅發生在須要爲啓動這個Activity建立進程時,通常狀況下是一個應用的入口Activity(包含Lanuncher中顯示的圖標進入的Activity及被其餘應用調用的Activity)。get

還有一種狀況就是應用內有多個進程的狀況(經過android:process),好比你的程序須要用單獨的進程查看圖片,當從你的應用的主進程進入圖片瀏覽的Activity時,系統就會建立圖片瀏覽的進程,若是圖片瀏覽的Activity的須要使用的圖標和Application指定的圖標不同的話就要注意了,系統顯示圖片進程中的Activity的Starting Window時不會使用這個Activity在Manifest中經過android:icon指定的圖標,而只會使用Theme中指定的圖標,若是沒爲這個Activity指定一個Theme或所指定的Theme中沒有指定android:icon的話,系統會使用Application標籤指定的android:icon,結果就是會看到Starting Window中顯示一個圖標,當Activity加載完後圖標會變爲Activity在Manifest中指定的android:icon,有一個變化的過程。it

更多介紹參考Android App Launching Made Gorgeousio

相關文章
相關標籤/搜索