高級安卓開發(fā)面試題詳解
網(wǎng)上遍布各種各樣的面試題涯雅,亦或只有題目帆吻,亦或答案不齊全普泡,盡個(gè)人所能將盡可能整理播掷。
1. 如何理解volatile?
被volatile修飾的變量撼班,JVM會(huì)把該線程對應(yīng)的本地內(nèi)存中的共享變量刷新到主內(nèi)存中叮趴。被修飾變量對所有線程可見、有序权烧、原子
參考:
Android并發(fā)編程之圖文解析volatile關(guān)鍵字
2.什么是ANR 如何避免它眯亦?
- Application Not Responding。程序響應(yīng)由AM和WM來監(jiān)控般码,出現(xiàn)以下情況會(huì)提示ANR:
- 5秒內(nèi)沒有響應(yīng)輸入內(nèi)容
- 廣播10秒內(nèi)沒有執(zhí)行完畢
- Service在20秒內(nèi)沒有處理完畢
- ANR發(fā)生的時(shí)候會(huì)在logcat打印錯(cuò)誤信息妻率,可獲取到ANR類型、CPU使用情況板祝、IOWait
宫静。除了log輸出外,你會(huì)發(fā)現(xiàn)各個(gè)應(yīng)用進(jìn)程和系統(tǒng)進(jìn)程的函數(shù)堆棧信息都輸出到了一個(gè)/data/anr/traces.txt的文件 - 避免主線程上執(zhí)行復(fù)雜耗時(shí)操作券时,比如收發(fā)網(wǎng)絡(luò)數(shù)據(jù)孤里、大量計(jì)算、操作數(shù)據(jù)庫橘洞、讀寫文件等捌袜;廣播和service要注意處理時(shí)常,如果有耗時(shí)操作放到線程中炸枣。
3.Activity的啟動(dòng)模式
1. standard標(biāo)準(zhǔn)模式:
每當(dāng)我們啟動(dòng)一個(gè)Activity虏等,系統(tǒng)就會(huì)相應(yīng)的創(chuàng)建一個(gè)實(shí)例,不管這個(gè)實(shí)例是否已經(jīng)存在适肠。這種模式霍衫,一個(gè)棧中可以有多個(gè)實(shí)例,每個(gè)實(shí)例也都有自己的任務(wù)棧侯养。而且是誰啟動(dòng)了此Activity敦跌,那么這個(gè)Activity就運(yùn)行在啟動(dòng)它的Activity所在的棧中。
2. singleTop棧頂復(fù)用模式:
如果要啟動(dòng)的Activity已經(jīng)處于棧的頂部逛揩,那么此時(shí)系統(tǒng)不會(huì)創(chuàng)建新的實(shí)例柠傍,而是直接打開此頁面,同時(shí)它的onNewIntent()方法會(huì)被執(zhí)行息尺,我們可以通過Intent進(jìn)行傳值携兵,而且它的onCreate()疾掰,onStart()方法不會(huì)被調(diào)用搂誉,因?yàn)樗]有發(fā)生任何變化。
歸納為以下三點(diǎn):
當(dāng)前棧中已有該Activity的實(shí)例并且該實(shí)例位于棧頂時(shí)静檬,不會(huì)創(chuàng)建實(shí)例炭懊,而是復(fù)用棧頂?shù)膶?shí)例并级,并且會(huì)將Intent對象傳入,回調(diào)onNewInten()方法侮腹;
當(dāng)前棧中已有該Activity的實(shí)例但是該實(shí)例不在棧頂時(shí)嘲碧,其行為和standard啟動(dòng)模式一樣,依然會(huì)創(chuàng)建一個(gè)新的實(shí)例父阻;
當(dāng)前棧中不存在該Activity的實(shí)例時(shí)愈涩,其行為同standard啟動(dòng)模式。
3. singleTask站內(nèi)復(fù)用模式:
如果棧中存在這個(gè)Activity的實(shí)例就會(huì)復(fù)用這個(gè)Activity加矛,不管它是否位于棧頂履婉,復(fù)用時(shí),會(huì)將它上面的Activity全部出棧斟览,因?yàn)閟ingleTask本身自帶clearTop這種功能毁腿。并且會(huì)回調(diào)該實(shí)例的onNewIntent()方法。其實(shí)這個(gè)過程還存在一個(gè)任務(wù)棧的匹配苛茂,因?yàn)檫@個(gè)模式啟動(dòng)時(shí)已烤,會(huì)在自己需要的任務(wù)棧中尋找實(shí)例,這個(gè)任務(wù)棧就是通過taskAffinity屬性指定妓羊。如果這個(gè)任務(wù)棧不存在胯究,則會(huì)創(chuàng)建這個(gè)任務(wù)棧。不設(shè)置taskAffinity屬性的話躁绸,默認(rèn)為應(yīng)用的包名唐片。
4. singleTask站內(nèi)復(fù)用模式:
如果棧中存在這個(gè)Activity的實(shí)例就會(huì)復(fù)用這個(gè)Activity,不管它是否位于棧頂涨颜,復(fù)用時(shí)费韭,會(huì)將它上面的Activity全部出棧,因?yàn)閟ingleTask本身自帶clearTop這種功能庭瑰。并且會(huì)回調(diào)該實(shí)例的onNewIntent()方法星持。其實(shí)這個(gè)過程還存在一個(gè)任務(wù)棧的匹配,因?yàn)檫@個(gè)模式啟動(dòng)時(shí)弹灭,會(huì)在自己需要的任務(wù)棧中尋找實(shí)例督暂,這個(gè)任務(wù)棧就是通過taskAffinity屬性指定。如果這個(gè)任務(wù)棧不存在穷吮,則會(huì)創(chuàng)建這個(gè)任務(wù)棧逻翁。不設(shè)置taskAffinity屬性的話,默認(rèn)為應(yīng)用的包名捡鱼。