性能優化18_提升程序的啓動速度及Splash頁面設計

Android性能優化彙總

1.啓動分爲兩種方式:

1)冷啓動:當直接從桌面上直接啓動,同時後臺沒有該進程的緩存,這個時候系統就需要
重新創建一個新的進程並且分配各種資源。
2)熱啓動:該app後臺有該進程的緩存,這時候啓動的進程就屬於熱啓動。

熱啓動不需要重新分配進程,也不會Application了,直接走的就是app的入口Activity,這樣就速度快很多

2.如何測量一個應用的啓動時間

使用命令行來啓動app,同時進行時間測量。單位:毫秒
adb shell am start -W [PackageName]/[PackageName.MainActivity]

adb shell am start -W com.gzsll.hupu/.ui.splash.SplashActivity
adb shell am start -W com.example.applicationstartoptimizedemo/com.example.applicationstartoptimizedemo.SplashActivity
adb shell am start -W com.dn.splashoptimize/com.dn.splashoptimize.MainActivity


ThisTime: 165 指當前指定的MainActivity的啓動時間
TotalTime: 165 整個應用的啓動時間,Application+Activity的使用的時間。
WaitTime: 175 包括系統的影響時間---比較上面大。

3.應用啓動的流程

Application從構造方法開始--->attachBaseContext()--->onCreate()
Activity構造方法--->onCreate()--->設置顯示界面佈局,設置主題、背景等等屬性
--->onStart()--->onResume()--->顯示裏面的view(測量、佈局、繪製,顯示到界面上)

時間花在哪裏了?

4.減少應用的啓動時間的耗時

1)、不要在Application的構造方法、attachBaseContext()、onCreate()裏面進行初始化耗時操作。
2)、MainActivity,由於用戶只關心最後的顯示的這一幀,對我們的佈局的層次要求要減少,自定義控件的話測量、佈局、繪製的時間。
	不要在onCreate、onStart、onResume當中做耗時操作。
3)、對於SharedPreference的初始化。
	因爲他初始化的時候是需要將數據全部讀取出來放到內存當中。
	優化1:可以儘可能減少sp文件數量(IO需要時間);2.像這樣的初始化最好放到線程裏面;3.大的數據緩存到數據庫裏面。

app啓動的耗時主要是在:Application初始化 + MainActivity的界面加載繪製時間。

由於MainActivity的業務和佈局複雜度非常高,甚至該界面必須要有一些初始化的數據才能顯示。
那麼這個時候MainActivity就可能半天都出不來,這就給用戶感覺app太卡了。

我們要做的就是給用戶趕緊利落的體驗。點擊app就立馬彈出我們的界面。
於是乎想到使用SplashActivity–非常簡單的一個歡迎頁面上面都不幹就只顯示一個圖片。

但是SplashActivity啓動之後,還是需要跳到MainActivity。MainActivity還是需要從頭開始加載佈局和數據。
想到SplashActivity裏面可以去做一些MainActivity的數據的預加載。然後需要通過意圖傳到MainActivity。

可不可以再做一些更好的優化呢?
耗時的問題:Application+Activity的啓動及資源加載時間;預加載的數據花的時間。

如果我們能讓這兩個時間重疊在一個時間段內併發地做這兩個事情就省時間了。

解決:
將SplashActivity和MainActivity合爲一個。

一進來還是現實的MainActivity,SplashActivity可以變成一個SplashFragment,然後放一個FrameLayout作爲根佈局直接現實SplashFragment界面。
SplashFragment裏面非常之簡單,就是現實一個圖片,啓動非常快。
當SplashFragment顯示完畢後再將它remove。同時在splash的2S的友好時間內進行網絡數據緩存。
這個時候我們纔看到MainActivity,就不必再去等待網絡數據返回了。

問題:SplashView和ContentView加載放到一起來做了 ,這可能會影響應用的啓動時間。
解決:可以使用ViewStub延遲加載MainActivity當中的View來達到減輕這個影響。

viewStub的設計就是爲了防止MainActivity的啓動加載資源太耗時了。延遲進行加載,不影響啓動,用戶友好。
但是viewStub加載也需要時間。等到主界面出來以後。
viewStub.inflate(xxxx);

5.如何設計延遲加載DelayLoad

第一時間想到的就是在onCreate裏面調用handler.postDelayed()方法。
問題:這個延遲時間如何控制?
不同的機器啓動速度不一樣。這個時間如何控制?
假設,需要在splash做一個動畫–2S

需要達到的效果:應用已經啓動並加載完成,界面已經顯示出來了,然後我們再去做其他的事情。

如果我們這樣:

mHandler.postDelayed(new Runnable() {
	@Override
	public void run() {
		mProgressBar.setVisibility(View.GONE);
		iv.setVisibility(View.VISIBLE);
	}
}, 2500);

是沒法做到等應用已經啓動並加載完成,界面已經顯示出來了,然後我們再去做其他的事情。

問題:什麼時候應用已經啓動並加載完成,界面已經顯示出來了。
onResume執行完了之後才顯示完畢。不行。
onwindowfocuschange
ViewTreeObserver

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章