應(yīng)用的啟動(dòng)方式
·
冷啟動(dòng)
·
當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)沒有該應(yīng)用的進(jìn)程,這時(shí)系統(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用。
·
系統(tǒng)會(huì)先創(chuàng)建和初始化
Application
類,再創(chuàng)建和初始化
LauncherActivity
類(包括一系列的測(cè)量、布局、繪制),最后顯示在界面上。
·
熱啟動(dòng)
·
當(dāng)啟動(dòng)應(yīng)用時(shí),后臺(tái)已有該應(yīng)用的進(jìn)程(例:按
back
鍵、
home
鍵),應(yīng)用雖然會(huì)退出,但是該應(yīng)用的進(jìn)程是依然會(huì)保留在后臺(tái),可進(jìn)入任務(wù)列表查看,所以在已有進(jìn)程的情況下,這種啟動(dòng)會(huì)從已有的進(jìn)程中來啟動(dòng)應(yīng)用。
·
熱啟動(dòng)因?yàn)闀?huì)從已有的進(jìn)程中來啟動(dòng),所以熱啟動(dòng)就不會(huì)走
Application
這步了,而是直接進(jìn)入
Activity
。
冷啟動(dòng)的啟動(dòng)過程分析
當(dāng)點(diǎn)擊app
的啟動(dòng)圖標(biāo)時(shí),安卓系統(tǒng)會(huì)從
Zygote
進(jìn)程中創(chuàng)建出一個(gè)新的進(jìn)程分配給該應(yīng)用,之后會(huì)依次創(chuàng)建和初始化
Application
類、創(chuàng)建
LauncherActivity
類、加載主題樣式中的
windowBackground
等屬性設(shè)置給
LauncherActivity
,然后配置
Activity
層級(jí)上的一些屬性、再加載布局顯示。
應(yīng)用的啟動(dòng)流程如下:Application
的構(gòu)造器方法
——>attachBaseContext()——>onCreate()——>Activity
的構(gòu)造方法
——>onCreate()——>
配置主題中背景等屬性
——>onStart()——>onResume()——>
測(cè)量布局繪制顯示在界面上
冷啟動(dòng)過程中的白屏問題
當(dāng)用戶點(diǎn)擊圖標(biāo)啟動(dòng)應(yīng)用到應(yīng)用首界面顯示,有時(shí)候會(huì)出現(xiàn)一段白屏或黑屏?xí)r間。原因大致有兩方面:其一,在Application
或
Activity
的
onCreate
方法中,加載資源耗時(shí)較長。其二,頁面布局相對(duì)復(fù)雜,渲染畫面花費(fèi)較長時(shí)間。
白屏的解決辦法
·
資源加載
·
首先盡量避免將耗時(shí)操作直接寫在
Application
的
onCreate()
中,可以采用異步或者
IntentService
的方式加載資源。
·
不要以靜態(tài)變量的方式在
Application
中保存數(shù)據(jù)
·
畫面渲染
·
為啟動(dòng)的
Activity
自定義一個(gè)
Theme
,指定一個(gè)閃屏畫面相同的背景圖片
<style name="AppSplash">
<item name="android:windowBackground">@mipmap/splash_bg</item>
</style>
·
將新的
Theme
應(yīng)用到設(shè)置到
AndroidManifest.xml
中
LauncherActivity
中
<activity android:name=".MainActivity"
android:theme="@style/AppWelcom">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
·
在
MainActivity
中需要設(shè)置回原來的
Theme
public
class
MainActivity
extends
AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
來源:簡書