一切有為法如夢(mèng)幻泡影武鲁,如露亦如電乐纸,應(yīng)做如是觀!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?---佛說(shuō)
1 開(kāi)機(jī)啟動(dòng)流程
2 App啟動(dòng)方式 (冷/熱/暖啟動(dòng))
1> 冷啟動(dòng):程序從頭開(kāi)始褒搔,系統(tǒng)沒(méi)有為該程序創(chuàng)建進(jìn)程订框,一般場(chǎng)景:程序安裝后的第一次啟動(dòng);應(yīng)用程序被系統(tǒng)終止后再打開(kāi);
2> 熱啟動(dòng):此時(shí)程序依然駐留再內(nèi)存中,只是被系統(tǒng)從后臺(tái)帶到前臺(tái)自赔,因此程序可以避免重復(fù)對(duì)象初始化,加載布局和渲染柳琢。需要注意的是绍妨,如果程序的某些內(nèi)存被系統(tǒng)清除,比如調(diào)用onTrimMemory方法柬脸,則需要重新創(chuàng)建這些對(duì)象以響應(yīng)熱啟動(dòng)事件他去。
3>暖啟動(dòng):它包含了熱啟動(dòng)和冷啟動(dòng)一系列的操作子集,比熱啟動(dòng)的消耗稍微多一點(diǎn)倒堕,它與熱啟動(dòng)最大的區(qū)別在于灾测,他必須通過(guò)調(diào)用onCreate方法重新開(kāi)始創(chuàng)建活動(dòng),也可以從傳遞給onCreate方法中保存的實(shí)例狀態(tài)中活得某些對(duì)象的恢復(fù)涩馆。
1>在App的啟動(dòng)流程中行施,當(dāng)系統(tǒng)加載并啟動(dòng)APP時(shí),需要耗費(fèi)相應(yīng)的時(shí)間魂那,即使時(shí)間不到1S,用戶(hù)也會(huì)感覺(jué)到當(dāng)點(diǎn)擊APP圖標(biāo)時(shí)會(huì)有延遲現(xiàn)象稠项,為解決這一問(wèn)題涯雅,Google的做法是在APP創(chuàng)建的過(guò)程中,先展示一個(gè)空白頁(yè)面展运,讓用戶(hù)體驗(yàn)到點(diǎn)擊圖標(biāo)之后立馬有響應(yīng)活逆;而這個(gè)空白頁(yè)面的顏色則是根據(jù)我們manifest文件中配置的主題背景顏色來(lái)決定的,默認(rèn)是白色拗胜。(Google添加的這個(gè)空白頁(yè)面是黑白屏產(chǎn)生的主要原因)
2>App從被系統(tǒng)調(diào)用蔗候,再到第一個(gè)頁(yè)面渲染到手機(jī)屏幕上面,我們只需要關(guān)注Application方法里面的onCreate方法埂软,以及第一個(gè)Activity的onCreate,onStart,onResume方法锈遥,如果在Appd啟動(dòng)第一個(gè)Activity時(shí),該Activity不但有自己的邏輯勘畔,在在onCreate,onStart,onResume方法中直接跳轉(zhuǎn)到了其他的Activity所灸,那么跳轉(zhuǎn)后的Activity的的這三個(gè)方法也需要優(yōu)化。
總結(jié):說(shuō)白了App黑白屏的優(yōu)化炫七,1?Google添加的這個(gè)空白頁(yè)面優(yōu)化 2?Application?onCreate方法優(yōu)化爬立,以及第一個(gè)Activity的onCreate,onStart,onResume方法優(yōu)化,本節(jié)講解Google添加的這個(gè)空白頁(yè)面優(yōu)化
解決方案1
AppTheme: (缺點(diǎn)會(huì)有短暫卡頓不被建議使用)
? 在應(yīng)用默認(rèn)的AppTheme中万哪,設(shè)置系統(tǒng)“取消預(yù)覽”(空白窗體)為true侠驯,或者設(shè)置空白窗體為透明抡秆,具體代碼如下所示
? ? ? ? ? ? ? ? <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
? ? ? ? ? ? ? ? ? <!-- Customize your theme here. -->
? ? ? ? ? ? ? ? ? <item name="colorPrimary">@color/colorPrimary</item>
? ? ? ? ? ? ? ? <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
? ? ? ? ? ? ? ? <item name="colorAccent">@color/colorAccent</item>
? ? ? ? ? ? ? ? <!--設(shè)置系統(tǒng)的取消預(yù)覽(空白窗口)為true-->
? ? ? ? ? ? ? ? <item name="android:windowDisablePreview">true</item>
? ? ? ? ? ? ? ? <!--設(shè)置背景為透明-->
? ? ? ? ? ? ? <item name="android:windowIsTranslucent">true</item>
? ? </style>
解決方案2
? 1>自定義繼承自AppTheme的主題
? 2>將啟動(dòng)Activity的theme設(shè)置為自定義的主題
3>在啟動(dòng)Activity的oncreate方法中,在super.onCreate()和setContentView方法之前調(diào)用setTheme方法吟策,將主題設(shè)置為最初的AppTheme
? ? ? ? <!--1自定義主題-->
? ? <style name="AppTheme.StyleTheme">
? ? ? ? <item name="android:windowBackground">@mipmap/ic_launcher</item>
? ? </style>
? ? <!--2設(shè)置啟動(dòng)Activity的主題-->
? ? ? <activity
? ? ? ? ? ? android:name=".DnakeActivity"
android:theme="@style/AppTheme.StyleTheme"
? ? ? ? ? ? android:excludeFromRecents="true">
? ? ? ? ? ? <intent-filter>
? ? ? ? ? ? ? ? <action android:name="android.intent.action.MAIN" />
? ? ? ? ? ? ? ? <category android:name="android.intent.category.LAUNCHER" />
? ? ? ? ? ? </intent-filter>
? ? ? ? </activity>
<!--3在代碼中將主題設(shè)置回來(lái)也可以不設(shè)置回來(lái)根據(jù)需求而定-->
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? ? setTheme(R.style.AppTheme);
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.foat_windowone);
? ? }