什么是冷啟動
冷啟動就是在應用啟動前掘猿,系統(tǒng)中沒有該應用的任何進程信息相赁。
比如說第一次打開整慎,應該殺死再開啟。
冷啟動/熱啟動的區(qū)別
熱啟動:用戶使用返回鍵退出應用酱讶,然后又馬上重新啟動應用
冷啟動退盯,系統(tǒng)會重新創(chuàng)建新的進程分配給它,所以會先創(chuàng)建和初始化 application類泻肯,再創(chuàng)建和初始化MainActivity類渊迁,然后會進行測量啊,布局繪制等等灶挟,最后顯示在界面上琉朽。
熱啟動,會從已有的進程來啟動稚铣,所以不會走application類箱叁,而直接走MainActivity 類墅垮。
冷啟動 時間的計算
在 android 4.4 之后,提供了一個方法
這個時間值耕漱,從應用啟動(創(chuàng)建進程)開始計算患整,到完成視圖的第一次繪制孵运,即activity 內(nèi)容對用戶可見為止捉撮。
冷啟動的流程
點擊App 啟動圖標的時候:
android系統(tǒng)會從 Zygote 進程中fork 創(chuàng)建出一個新的進程
創(chuàng)建和初始化 Application 類漱贱,創(chuàng)建MainActivity 類
inflate 布局 ,當onCreate/onStart/onResume 方法都走完
contentView 的measure/layout/draw 顯示在界面上
Application 的構(gòu)造方法 -->attachBaseContext() --> applicaition 的onCreate() --> Activity 的構(gòu)造方法 --> act 的 onCreate() ---> 配值主題中的背景 屬性 等等 -----> onStart() -----> onResume() -----> 測量布局 繪制 顯示在界面上妓笙。
重點之 冷啟動的優(yōu)化
- 減少onCreate( ) 方法的工作量
用戶總要等待一個啟動時間若河,而我們所能做的 就是 在 applicaiton 和第一個MainActivity 類 減少 onCreate() 的工作量,從而減短時間冷啟動時間给郊,但是又不得不使用一些第三方SDK牡肉,可以使用一些懶加載,在真正使用的地方再去初始化淆九。
在Activity 創(chuàng)建的過程中统锤,其實是會經(jīng)過一系列 framework層的代碼。但是懶加載也有不好的地方炭庙,就是很難把所有的場景都列出饲窿,哪個第三方是 先使用的,所以一般還是放在 applicaition 去初始化 - 不要讓Application 參與 業(yè)務(wù)操作
- 不要在 Application 進行耗時操作
- 不要以靜態(tài)變量的方式 在Application 中保存數(shù)據(jù)
- 布局 / mainThread 的 操作
其他優(yōu)化
android 不要用靜態(tài)變量存儲數(shù)據(jù)
因為在Android 中焕蹄,進程不是安全的逾雄,有時候會被殺掉,下次是 重新初始化的 進程腻脏,數(shù)據(jù)不安全鸦泳。
使用其他 數(shù)據(jù)傳輸文件:文件 / sp / contentProvider
傳輸數(shù)據(jù)可以用intent
有關(guān)Sharepreference 問題
不能跨進程同步
在多進程讀寫的時候,不能跨進程的讀寫數(shù)據(jù)永品,或者獲取數(shù)據(jù)做鹰, 每個進程都會維護自己的一份sharepreference 副本,在它運行過程中鼎姐,其他進程是無法獲取這個shareprefer 副本钾麸,只有在應用結(jié)束之后,才能將每個進程的副本持久化的修改到文件系統(tǒng)當中炕桨。
存儲Sharepreference 的文件過大問題
android 五大存儲之一: 網(wǎng)絡(luò)饭尝,數(shù)據(jù)庫,contentProvider献宫,文件钥平,sp。
以 key -vlaue 成對存儲的
如果存的文件比較大
第一個問題就是:獲取值的時候有可能阻塞主線程姊途,影響性能涉瘾,有可能引起界面卡頓奈惑。
第二個問題就是:解析式會產(chǎn)生大量的 臨時對象,會造成頻繁的垃圾回收睡汹,大量的gc 造成內(nèi)存抖動。
key-value 存在內(nèi)存中寂殉,耗內(nèi)存
內(nèi)存對象的序列化
序列化:將對象 的狀態(tài)信息轉(zhuǎn)化為可以存儲傳輸?shù)牡男问降倪^程
- Serializable java 的 序列化方式 會產(chǎn)生大量的臨時變量囚巴,引起垃圾回收
- Parcelable 是 android中自帶的一種序列化方式,比Serializable 性能更好友扰,有個明顯的缺點就是彤叉,不能把那些要存儲在磁盤上的數(shù)據(jù)用parcelabel 來序列化 ,其本質(zhì)就是為了實現(xiàn)對象在進程間的傳遞村怪,并不是一個通用的序列化機制秽浇,用的場合基本都是android的進程間的通信。