activity的狀態(tài)
Running->paused->stop->kill
- Running是當(dāng)前Activity位于棧頂時開始調(diào)用
- paused是當(dāng)前activity失去焦點以后調(diào)用的
- stop是當(dāng)前activity不再顯示以后,就是看不見以后調(diào)用
- kill是當(dāng)前activity被后臺系統(tǒng)回收以后
activity的生命周期
- activity啟動以后-> onCreate - onStart - onResume
- 按Home鍵以后 -> onPause - onStop
- 再次返回activity以后 -> onRestart - onStart - onResume
- 退出當(dāng)前activity以后 -> onPause -onStop - onDestroy
android進(jìn)程優(yōu)先級
前臺進(jìn)程 / 可見 / 服務(wù) / 后臺 / 空
- 前臺進(jìn)程就是正在與用戶交互的進(jìn)程,持有焦點
- 可見進(jìn)程就是已經(jīng)失去了焦點,但依然可見,比如activity里彈了一個對話框,那activity就會進(jìn)入可見進(jìn)程
- 服務(wù)進(jìn)程 由名字就可以看到,是開啟一個服務(wù)
- 后臺進(jìn)程 是比如當(dāng)前activity按home鍵以后,將會進(jìn)入后臺
- 空進(jìn)程 就是一個空進(jìn)程,什么都沒有了,隨時有可能被殺掉
activity啟動模式
- standard 默認(rèn)模式 每次打開新的activity時,都會去new一個新的實例,進(jìn)入任務(wù)棧,生命周期也會正常調(diào)用
- singletop 棧頂復(fù)用模式 當(dāng)打開新的activity時,棧頂已經(jīng)有當(dāng)前activity的實例存在,會復(fù)用棧頂?shù)模?調(diào)用onNewIntent方法 不會重走生命周期
- singletask 棧內(nèi)復(fù)用模式 當(dāng)打開新的activity時,如果棧內(nèi)已經(jīng)有了當(dāng)前activity的實例,會復(fù)用棧內(nèi)的,同時把該實例上面的所有實例,彈出任務(wù)棧 也是調(diào)用onNewIntent方法,不會重走生命周期
- singleInstance 單例 一個任務(wù)棧只持有一個實例
scheme跳轉(zhuǎn)協(xié)議
Handler
Handler機(jī)制是一種線程間通訊機(jī)制,在我們在activity中初始化一個handler時,handler的構(gòu)造函數(shù)中獲取獲取looper對象,且再使用looper對象獲取MessageQueue消息隊列,所以我們需要在handler構(gòu)造之前實例化looper對象,主線程在應(yīng)用啟動時的main方法里,調(diào)用了Looper.prepare()方法,里面初始化了一個新的Looper對象,并且存放在了ThreadLocal中,
初始化Handler
Looper.prepare() 初始化Looper
ThreadLocal Thread.get() = ThreadLocalMap 以ThreadLocal為key,Entry[]為值
handler.sendMessage()
Looper.loop() MessageQueue
HandlerThread 一個封裝了Looper的thread
IntentService 一個封裝了handler和HandlerThread的Service
ANR的產(chǎn)生和處理
- 基本上四大組件都是在主線程里處理的,所以產(chǎn)生應(yīng)用ANR的原因基本上都是在主線程中做耗時操作
- 解決ARN 使用AsynTask HandlerThread進(jìn)行耗時操作
UI卡頓
- 每秒六十幀 十六毫秒一幀 所以十六毫秒刷新一次,超過這個界值,肉眼看上去就會卡頓
- overdraw 過渡繪制 布局layout過于復(fù)雜
- 同一時間動畫執(zhí)行次數(shù)過多
- hierarchyView工具檢測 View的繪制過程的速度
解決辦法
- 布局優(yōu)化
- listview及adapter優(yōu)化,列表滑動時不加載圖片
- 避免ANR
內(nèi)存溢出
檢測工具 LeakCanary,其原理是監(jiān)控每個activity,在activity ondestory后,在后臺線程檢測引用,然后過一段時間進(jìn)行g(shù)c,gc后如果引用還在,那么dump出內(nèi)存堆棧,并解析進(jìn)行可視化顯示。使用LeakCanary可以快速地檢測出Android中的內(nèi)存泄露。
- 單例
- 非靜態(tài)內(nèi)部類
- Handler
- 盡量避免使用static成員變量
- 資源未關(guān)閉
網(wǎng)絡(luò)優(yōu)化
- AndroidStudio自帶的Monitor檢測網(wǎng)絡(luò)
- 使用Fildder抓包工具檢測
優(yōu)化方式
- 做緩存操作
- 避免過度網(wǎng)絡(luò)請求
- 根據(jù)實際需求制定網(wǎng)絡(luò)請求策略,WIFI或者使用流量,策略是不同的
APK瘦身
- 移除無用代碼
- 避免無用的庫,或者功能相似的庫
- 啟用混淆
- 第三方庫的瘦身,僅保留自己需要的一部分
- 圖片轉(zhuǎn)為WebP
- 在允許的情況下,針對用戶機(jī)型分布保留特定架構(gòu)的So;