Android啟動(dòng)窗口SplashScreen

首先介紹下什么是啟動(dòng)窗口,對(duì)于大部分應(yīng)用冷啟動(dòng)時(shí)的場(chǎng)景都會(huì)有啟動(dòng)窗口倍谜,為了讓效果更明顯迈螟,在如下代碼中(只是一個(gè)基本的可以運(yùn)行的應(yīng)用即可)添加了sleep5s的代碼,在按recent鍵移除應(yīng)用后枢劝,再點(diǎn)擊桌面圖標(biāo)井联,即可看到啟動(dòng)窗口效果,即使點(diǎn)擊后界面內(nèi)容顯示出來(lái)前的白色界面

image-20200627223615053.png

1596117549969.gif

啟動(dòng)窗口有什么用途呢您旁,從邏輯及效果看烙常,其應(yīng)該主要是用于一個(gè)過(guò)渡,比如上述添加了5s延時(shí)的場(chǎng)景中鹤盒,如果沒(méi)有啟動(dòng)窗口蚕脏,那么點(diǎn)擊了桌面的應(yīng)用圖標(biāo)后,會(huì)有5s多的時(shí)間用戶看不到什么反應(yīng)侦锯,會(huì)讓用戶覺得是不是應(yīng)用沒(méi)啟動(dòng)啊驼鞭,我們可以試驗(yàn)下,可在style中添加
<item name="android:windowDisablePreview">true</item>
項(xiàng)尺碰,即可禁用啟動(dòng)窗口挣棕,如


image-20200627224321594.png

對(duì)用戶和應(yīng)用來(lái)說(shuō)一個(gè)白色界面作為啟動(dòng)窗口可能不是很美觀,也可以做一些自定義行為

1亲桥、一般需要較長(zhǎng)時(shí)間加載的應(yīng)用啟動(dòng)窗口的作用更明顯洛心,所以可以實(shí)現(xiàn)個(gè)簡(jiǎn)單的Activity作為歡迎界面,待準(zhǔn)備工作加載完成后题篷,即可跳轉(zhuǎn)到正式界面

2词身、啟動(dòng)窗口界面內(nèi)容本身有配置的方法,可通過(guò)配置
<item name="android:windowSplashscreenContent"> </item>
項(xiàng)來(lái)設(shè)置啟動(dòng)窗口的內(nèi)容界面番枚,顯然這里可設(shè)置一個(gè)drawable法严,在添加啟動(dòng)窗口界面時(shí)损敷,會(huì)將該drawable添加到啟動(dòng)窗口的內(nèi)容視圖中,如

image-20200627224150879.png

1596117876257.gif

另外可通過(guò)設(shè)置<item name="windowAnimationStyle"> </item>來(lái)設(shè)置相關(guān)動(dòng)畫深啤,這里就不舉例了

添加啟動(dòng)窗口代碼邏輯(使用android-10.0.0_r39分支代碼查看)

(添加時(shí)機(jī)拗馒,一般是前臺(tái)task切換時(shí)可能會(huì)觸發(fā),比較特別地是一般新啟動(dòng)一個(gè)應(yīng)用墓塌,或殺掉一個(gè)應(yīng)用進(jìn)程后啟動(dòng)該應(yīng)用時(shí)瘟忱,這種情況下一般都會(huì)有啟動(dòng)窗口,如設(shè)置苫幢、電話等應(yīng)用新啟動(dòng)時(shí)访诱,會(huì)先顯示一個(gè)空白的界面,然后顯示設(shè)置界面內(nèi)容韩肝,那個(gè)空白的界面即其啟動(dòng)窗口)

ActivityRecord.java-showStartingWindow

image-20200627224821300.png

在這里會(huì)調(diào)用其addStartingWindow方法(ActivityRecord)

image-20200627225544058.png

顯然触菜,這里主要是調(diào)用了AppWindowToken的addStartingWindow方法,查看AppWindowToken的addStartingWindow方法哀峻,這里邏輯稍多涡相,介紹下其主要部分

1、該方法中會(huì)調(diào)用getStartingWindowType方法根據(jù)場(chǎng)景獲取需要啟動(dòng)窗口類型

image-20200627225858187.png

其中AppWindowToken的getStartingWindowType方法邏輯如下

image-20200627230030337.png

從上述代碼可知getStartingWindowType方法可能返回三種值 STARTING_WINDOW_TYPE_NONE剩蟀,STARTING_WINDOW_TYPE_SPLASH_SCREEN 催蝗,STARTING_WINDOW_TYPE_SNAPSHOT

返回類型為STARTING_WINDOW_TYPE_NONE時(shí)看其邏輯應(yīng)該是無(wú)啟動(dòng)窗口的

返回類型為STARTING_WINDOW_TYPE_SPLASH_SCREEN時(shí)即可能會(huì)有場(chǎng)景中的啟動(dòng)窗口,比如在殺掉設(shè)置進(jìn)程后(點(diǎn)擊recent導(dǎo)航鍵育特,移除設(shè)置)丙号,點(diǎn)擊設(shè)置圖標(biāo)后馬上dumpsys window信息可看到有如下窗口,這就是啟動(dòng)窗口的窗口缰冤,也是這里主要介紹的邏輯(如下是設(shè)置的啟動(dòng)窗口)

image-20200627230345034.png

返回類型為STARTING_WINDOW_TYPE_SNAPSHOT時(shí)犬缨,會(huì)調(diào)用createSnapshot方法,這里也會(huì)臨時(shí)添加一個(gè)特殊的窗口棉浸,比如進(jìn)入設(shè)置后怀薛,回到桌面,點(diǎn)擊recent導(dǎo)航鍵迷郑,然后點(diǎn)擊枝恋,這里就不細(xì)將了

image-20200627230604007.png

2、如果theme中設(shè)置了windowIsTranslucent為true嗡害,或者設(shè)置了windowIsFloating為true鼓择,或者設(shè)置了windowDisablePreview為true,則不會(huì)添加啟動(dòng)窗口

image-20200627230838390.png

3就漾、AppWindowToken的addStartingWindow方法的主要邏輯會(huì)創(chuàng)建一個(gè)SplashScreenStartingData對(duì)象,然后調(diào)用scheduleAddStartingWindow方法

image-20200627231001578.png

AppWindowToken的addStartingWindow方法就到這里了念搬,繼續(xù)跟蹤其主要邏輯

scheduleAddStartingWindow方法主要是將一個(gè)mAddStartingWindow任務(wù)放到一個(gè)handler隊(duì)首去執(zhí)行

image-20200627231135203.png

再看下mAddStartingWindow的邏輯:

image-20200627231354809.png

這里mStartingData即是前面addStartingWindow中創(chuàng)建的SplashScreenStartingData對(duì)象(只針對(duì)這里STARTING_WINDOW_TYPE_SPLASH_SCREEN的情況)抑堡,這里主要邏輯即調(diào)用SplashScreenStartingData的createStartingSurface方法

image-20200627231547302.png

顯然摆出,SplashScreenStartingData的createStartingSurface方法中調(diào)用了PhoneWindowManager的addSplashScreen方法而PhoneWindowManager的addSplashScreen方法也即是添加啟動(dòng)窗口的地方

image-20200627231806108.png
image-20200627231853737.png
image-20200627231958425.png
image-20200627232221316.png

如上即是PhoneWindowManager的addSplashScreen方法的代碼,其主要部分就是創(chuàng)建一個(gè)PhoneWindow對(duì)象首妖,然后設(shè)置些屬性和視圖(基本上應(yīng)該是全屏偎漫,內(nèi)容應(yīng)該是根據(jù)theme相關(guān)只有框架的界面,具體內(nèi)容一般為空白有缆,有的有圖標(biāo)和標(biāo)題)象踊,然后調(diào)用WindowManager服務(wù)的addView方法添加窗口

這里也有幾個(gè)可設(shè)置相關(guān)屬性的地方

1、windowAnimationStyle

image-20200627232535987.png

應(yīng)該可以通過(guò)設(shè)置windowAnimationStyle設(shè)置相關(guān)動(dòng)畫

2棚壁、windowSplashscreenContent

image-20200627232650202.png

根據(jù)啟動(dòng)窗口調(diào)用的addSplashscreenContent方法杯矩,應(yīng)該可以通過(guò)設(shè)置windowSplashscreenContent屬性來(lái)設(shè)置啟動(dòng)窗口的內(nèi)容圖片

在添加啟動(dòng)窗口呼,待合適的時(shí)機(jī)袖外,如應(yīng)用界面繪制完成則會(huì)觸發(fā)AppWindowToken的removeStartingWindow方法調(diào)用史隆,然后移除啟動(dòng)窗口,這里就不細(xì)述了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載曼验,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者泌射。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鬓照,隨后出現(xiàn)的幾起案子熔酷,更是在濱河造成了極大的恐慌,老刑警劉巖豺裆,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拒秘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡留储,警方通過(guò)查閱死者的電腦和手機(jī)翼抠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)获讳,“玉大人阴颖,你說(shuō)我怎么就攤上這事∝はィ” “怎么了量愧?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)帅矗。 經(jīng)常有香客問(wèn)我偎肃,道長(zhǎng),這世上最難降的妖魔是什么浑此? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任累颂,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘紊馏。我一直安慰自己料饥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布朱监。 她就那樣靜靜地躺著岸啡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赫编。 梳的紋絲不亂的頭發(fā)上巡蘸,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音擂送,去河邊找鬼悦荒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛团甲,可吹牛的內(nèi)容都是我干的逾冬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躺苦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼身腻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起匹厘,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嘀趟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后愈诚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體她按,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年炕柔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酌泰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匕累,死狀恐怖陵刹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欢嘿,我是刑警寧澤衰琐,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站炼蹦,受9級(jí)特大地震影響羡宙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掐隐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一狗热、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦匿刮、人聲如沸指攒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至膝擂,卻和暖如春虑啤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背架馋。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工狞山, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叉寂。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓萍启,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親屏鳍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勘纯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354