面試話術(shù)

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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容