可能有人要問了,這不是挺好的一個(gè)歡迎界面嗎?有啥問題,我相信看的仔細(xì)的看官會發(fā)現(xiàn)啟動之后有一段時(shí)間是空白的,即使是很短,讓人看著也不舒服,這時(shí)候可能又有人說了,那可能是你在application里面干了耗時(shí)的事才導(dǎo)致的,話說我一開始也是這樣覺得的,然后我令寫一個(gè)demo作測試,發(fā)現(xiàn)然而并不關(guān)你的application什么事兒,因?yàn)槲叶紱]有application,啟動的時(shí)候依然有這樣的問題,然后我就去對比我手機(jī)上騰訊公司和其他公司的產(chǎn)品,我發(fā)現(xiàn)他們的app大多是在你手指按下桌面圖標(biāo)的時(shí)候,先“靜止”一段時(shí)間,然后再啟動,而且中間一點(diǎn)白色的間隙也沒有,這是什么鬼,帶著疑惑,我去百度了一番,發(fā)現(xiàn)問題還真有:
后來我才之后,原來有冷熱啟動這一說:
1、冷啟動:當(dāng)啟動應(yīng)用時(shí),后臺沒有該應(yīng)用的進(jìn)程,這時(shí)系統(tǒng)會重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用,這個(gè)啟動方式就是冷啟動。
特點(diǎn):冷啟動因?yàn)橄到y(tǒng)會重新創(chuàng)建一個(gè)新的進(jìn)程分配給它,所以會先創(chuàng)建和初始化application類,再創(chuàng)建和初始化MainActivity類(包括一系列的測量、布局、繪制),最后顯示在界面上。
2、熱啟動:當(dāng)啟動應(yīng)用時(shí),后臺已有該應(yīng)用的進(jìn)程(例:按back鍵、home鍵,應(yīng)用雖然會退出,但是該應(yīng)用的進(jìn)程是依然會保留在后臺,可進(jìn)入任務(wù)列表查看),所以在已有進(jìn)程的情況下,這種啟動會從已有的進(jìn)程中來啟動應(yīng)用,這個(gè)方式叫熱啟動。
特點(diǎn):熱啟動因?yàn)闀囊延械倪M(jìn)程中來啟動,所以熱啟動就不會走application這步了,而是直接走MainActivity(包括一系列的測量、布局、繪制),所以熱啟動的過程只需要創(chuàng)建和初始化一個(gè)MainActivity就行了,而不必創(chuàng)建和初始化application,因?yàn)橐粋€(gè)應(yīng)用從新進(jìn)程的創(chuàng)建到進(jìn)程的銷毀,application只會初始化一次。
既然上述問題不是出在application,那么肯定就是在Activity了,我是這么想的,然后我就想著是不是SetContentView的時(shí)候花了很多時(shí)間呢?然后我又測試了一遍:
@OverridePRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); long startTime = System.currentTimeMillis(); setContentView(R.layout.activity_start); Log.d(TAG, "time===" + (System.currentTimeMillis() - startTime));}然后打印出來的時(shí)間是:
哈,果真是setContentView導(dǎo)致的,那就很好解決了,我們不要setContentView就好了,可能還有人要問了,你不要setContentView你咋加載布局呢?別急,別忘了還有theme這個(gè)好東西啊!我們可以定義一個(gè)theme,然后給theme設(shè)置背景就好了:
<style name="StartTheme" parent="Aipmap/icon_splash</item></style>好了,大功告成,我們來看看效果:
注:setContentView的內(nèi)部原理有興趣的同學(xué)可以自己去百度看看,看看在哪里耗時(shí)了
新聞熱點(diǎn)
疑難解答