這里收集整理的是今年大廠Android開發(fā)崗的面試題,問的深度不算高或粮,但是大多數(shù)程序員真不一定能回答得上导饲。大家可以查漏補(bǔ)缺檢驗一下自身水平。
切記!學(xué)如逆水行舟渣锦,不進(jìn)則退
目錄
1.如何對 Android 應(yīng)用進(jìn)行性能分析
2.什么情況下會導(dǎo)致內(nèi)存泄露
3.如何避免 OOM 異常
4.Android 中如何捕獲未捕獲的異常
5.ANR 是什么硝岗?怎樣避免和解決 ANR(重要)
6.Android 線程間通信有哪幾種方式
7.Devik 進(jìn)程,linux 進(jìn)程袋毙,線程的區(qū)別
8.描述一下 android 的系統(tǒng)架構(gòu)
9.android 應(yīng)用對內(nèi)存是如何限制的?我們應(yīng)該如何合理使用內(nèi)存型檀?
10. 簡述 android 應(yīng)用程序結(jié)構(gòu)是哪些
11.請解釋下 Android 程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
12.Framework 工作方式及原理,Activity 是如何生成一個 view 的听盖,機(jī)制是什么
13.多線程間通信和多進(jìn)程之間通信有什么不同胀溺,分別怎么實現(xiàn)
14.Android 屏幕適配
15.什么是 AIDL 以及如何使用
16.Handler 機(jī)制
17.事件分發(fā)機(jī)制
18.子線程發(fā)消息到主線程進(jìn)行更新 UI,除了 handler 和 AsyncTask媳溺,還有什么
19.子線程中能不能 new handler月幌?為什么
20.Android 中的動畫有哪幾類,它們的特點和區(qū)別是什么
21.如何修改 Activity 進(jìn)入和退出動畫
22.SurfaceView & View 的區(qū)別
23.開發(fā)中都使用過哪些框架悬蔽、平臺
24.使用過那些自定義View
25.自定義控件:繪制圓環(huán)的實現(xiàn)過程
26.自定義控件:摩天輪的實現(xiàn)過程
27.GridLayout的使用
28.流式布局的實現(xiàn)過程
29.第三方登陸
30.第三方支付
31.進(jìn)程背短桑活
一、性能優(yōu)化
1.如何對 Android 應(yīng)用進(jìn)行性能分析
android 性能主要之響應(yīng)速度 和UI刷新速度蝎困。
可以參考博客:Android系統(tǒng)性能調(diào)優(yōu)工具介紹
首先從函數(shù)的耗時來說录语,有一個工具TraceView 這是androidsdk自帶的工作,用于測量函數(shù)耗時的禾乘。
UI布局的分析澎埠,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的布局層次始藕,以及每個View刷新加載的時間蒲稳。
這樣可以很快定位到那塊layout & View 耗時最長。
還有就是通過自定義View來減少view的層次伍派。
2.什么情況下會導(dǎo)致內(nèi)存泄露
內(nèi)存泄露是個折騰的問題江耀。
什么時候會發(fā)生內(nèi)存泄露?內(nèi)存泄露的根本原因:長生命周期的對象持有短生命周期的對象诉植。短周期對象就無法及時釋放祥国。
1. 靜態(tài)集合類引起內(nèi)存泄露
主要是hashmap,Vector等晾腔,如果是靜態(tài)集合 這些集合沒有及時setnull的話舌稀,就會一直持有這些對象。
2.remove 方法無法刪除set集 Objects.hash(firstName, lastName);
經(jīng)過測試灼擂,hashcode修改后壁查,就沒有辦法remove了。
3.observer 我們在使用監(jiān)聽器的時候剔应,往往是addxxxlistener睡腿,但是當(dāng)我們不需要的時候康谆,忘記removexxxlistener,就容易內(nèi)存leak嫉到。
廣播沒有unregisterrecevier
4.各種數(shù)據(jù)鏈接沒有關(guān)閉,數(shù)據(jù)庫contentprovider月洛,io何恶,sokect等。cursor
5.內(nèi)部類:
java中的內(nèi)部類(匿名內(nèi)部類)嚼黔,會持有宿主類的強(qiáng)引用this细层。
所以如果是new Thread這種,后臺線程的操作唬涧,當(dāng)線程沒有執(zhí)行結(jié)束時疫赎,activity不會被回收。
Context的引用碎节,當(dāng)TextView 等等都會持有上下文的引用捧搞。如果有static drawable,就會導(dǎo)致該內(nèi)存無法釋放狮荔。
6.單例
單例 是一個全局的靜態(tài)對象胎撇,當(dāng)持有某個復(fù)制的類A是,A無法被釋放殖氏,內(nèi)存leak晚树。
3.如何避免 OOM 異常
首先OOM是什么?
當(dāng)程序需要申請一段“大”內(nèi)存雅采,但是虛擬機(jī)沒有辦法及時的給到爵憎,即使做了GC操作以后
這就會拋出 OutOfMemoryException 也就是OOM
Android的OOM怎么樣?
為了減少單個APP對整個系統(tǒng)的影響婚瓜,android為每個app設(shè)置了一個內(nèi)存上限宝鼓。
public void getMemoryLimited(Activity context)
{
ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
System.out.println(activityManager.getMemoryClass());
System.out.println(activityManager.getLargeMemoryClass());
System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024));
}
HTC M7實測,192M上限闰渔。512M 一般情況下席函,192M就是上限,但是由于某些特殊情況冈涧,android允許使用一個更大的RAM茂附。
如何避免OOM
減少內(nèi)存對象的占用
1.ArrayMap/SparseArray代替hashmap
2.避免在android里面使用Enum
3.減少bitmap的內(nèi)存占用
inSampleSize:縮放比例,在把圖片載入內(nèi)存之前督弓,我們需要先計算出一個合適的縮放比例营曼,避免不必要的大圖載入。
decode format:解碼格式愚隧,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8蒂阱,存在很大差異。
4.減少資源圖片的大小,過大的圖片可以考慮分段加載
內(nèi)存對象的重復(fù)利用
大多數(shù)對象的復(fù)用录煤,都是利用對象池的技術(shù)鳄厌。
1.listview/gridview/recycleview contentview的復(fù)用
2.inBitmap 屬性對于內(nèi)存對象的復(fù)用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
這個方法在某些條件下非常有用,比如要加載上千張圖片的時候妈踊。
3.避免在ondraw方法里面 new對象
4.StringBuilder 代替+
4.Android 中如何捕獲未捕獲的異常
CrashHandler
關(guān)鍵是實現(xiàn)Thread.UncaughtExceptionHandler
然后是在application的oncreate里面注冊了嚎。
5.ANR 是什么?怎樣避免和解決 ANR(重要)
ANR->Application Not Responding
也就是在規(guī)定的時間內(nèi)廊营,沒有響應(yīng)歪泳。
三種類型:
1). KeyDispatchTimeout(5 seconds) —主要類型按鍵或觸摸事件在特定時間內(nèi)無響應(yīng)
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定時間內(nèi)無法處理完成
3). ServiceTimeout(20 seconds) —小概率類型 Service在特定的時間內(nèi)無法處理完成
為什么會超時:事件沒有機(jī)會處理 & 事件處理超時
怎么避免ANR
ANR的關(guān)鍵
是處理超時,所以應(yīng)該避免在UI線程露筒,BroadcastReceiver 還有service主線程中呐伞,處理復(fù)雜的邏輯和計算
而交給work thread操作。
1)避免在activity里面做耗時操作慎式,oncreate & onresume
2)避免在onReceiver里面做過多操作
3)避免在Intent Receiver里啟動一個Activity伶氢,因為它會創(chuàng)建一個新的畫面,并從當(dāng)前用戶正在運行的程序上搶奪焦點瞬捕。
4)盡量使用handler來處理UI thread & workthread的交互鞍历。
如何解決ANR
首先定位ANR發(fā)生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstarted
CPUusage from 4361ms to 699ms ago ----CPU在ANR發(fā)生前的使用情況
04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait
04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
從log可以看出,cpu在做大量的io操作肪虎。
所以可以查看io操作的地方劣砍。
當(dāng)然,也有可能cpu占用不高扇救,那就是 主線程被block住了刑枝。
6.Android 線程間通信有哪幾種方式
1)共享變量(內(nèi)存)
2)管道
3)handle機(jī)制
runOnUiThread(Runnable)
view.post(Runnable)
7.Devik 進(jìn)程,linux 進(jìn)程迅腔,線程的區(qū)別
Dalvik進(jìn)程装畅。
每一個android app都會獨立占用一個dvm虛擬機(jī),運行在linux系統(tǒng)中沧烈。
所以dalvik進(jìn)程和linux進(jìn)程是可以理解為一個概念掠兄。
8.描述一下 android 的系統(tǒng)架構(gòu)
從小到上就是:
linux kernel,lib dalvik vm ,application framework, app
9.android 應(yīng)用對內(nèi)存是如何限制的?我們應(yīng)該如何合理使用內(nèi)存?
activitymanager.getMemoryClass() 獲取內(nèi)存限制锌雀。
關(guān)于合理使用內(nèi)存蚂夕,其實就是避免OOM & 內(nèi)存泄露中已經(jīng)說明。
10. 簡述 android 應(yīng)用程序結(jié)構(gòu)是哪些
1)main code
- unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一種很早就有的技術(shù)了腋逆,翻譯過來就是紋理映射技術(shù).
google建議只把啟動圖片放入婿牍。
5)lib
6)color
11.請解釋下 Android 程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
文件的系統(tǒng)權(quán)限是由linux系統(tǒng)規(guī)定的,只讀惩歉,讀寫等等脂。
運行時權(quán)限俏蛮,是對于某個系統(tǒng)上的app的訪問權(quán)限,允許上遥,拒絕搏屑,詢問。該功能可以防止非法的程序訪問敏感的信息粉楚。
12.Framework 工作方式及原理睬棚,Activity 是如何生成一個 view 的蹦疑,機(jī)制是什么
Framework是android 系統(tǒng)對 linux kernel见秤,lib庫等封裝留夜,提供WMS,AMS撵摆,bind機(jī)制,handler-message機(jī)制等方式害晦,供app使用特铝。
簡單來說framework就是提供app生存的環(huán)境。
1)Activity在attch方法的時候壹瘟,會創(chuàng)建一個phonewindow(window的子類)
2)onCreate中的setContentView方法鲫剿,會創(chuàng)建DecorView
3)DecorView 的addview方法,會把layout中的布局加載進(jìn)來稻轨。
13.多線程間通信和多進(jìn)程之間通信有什么不同灵莲,分別怎么實現(xiàn)
線程間的通信可以參考第6點。
進(jìn)程間的通信:bind機(jī)制(IPC->AIDL)殴俱,linux級共享內(nèi)存政冻,boradcast,
Activity 之間线欲,activity & serview之間的通信明场,無論他們是否在一個進(jìn)程內(nèi)。
14.Android 屏幕適配
屏幕適配的方式:xxxdpi李丰, wrap_content,match_parent. 獲取屏幕大小苦锨,做處理。
dp來適配屏幕趴泌,sp來確定字體大小
drawable-xxdpi, values-1280*1920等 這些就是資源的適配舟舒。
wrap_content,match_parent, 這些是view的自適應(yīng)
weight,這是權(quán)重的適配踱讨。
15.什么是 AIDL 以及如何使用
Android Interface Definition Language
AIDL是使用bind機(jī)制來工作魏蔗。
參數(shù):
java原生參數(shù)
String
parcelable
list & map 元素 需要支持AIDL
16.Handler 機(jī)制
參考:android 進(jìn)程/線程管理(一)——消息機(jī)制的框架 這個系類。
17.事件分發(fā)機(jī)制
android 事件分發(fā)機(jī)制
帶你一起探究Android事件分發(fā)機(jī)制痹筛, 讓面試提問不在畏懼莺治!
18.子線程發(fā)消息到主線程進(jìn)行更新 UI廓鞠,除了 handler 和 AsyncTask,還有什么
EventBus谣旁,廣播床佳,view.post, runinUiThread
但是無論各種花樣,本質(zhì)上就2種:handler機(jī)制 + 廣播
19.子線程中能不能 new handler砌们?為什么
必須可以。子線程 可以new 一個mainHandler搁进,然后發(fā)送消息到UI Thread浪感。
20.Android 中的動畫有哪幾類饼问,它們的特點和區(qū)別是什么
視圖動畫影兽,或者說補(bǔ)間動畫。只是視覺上的一個效果莱革,實際view屬性沒有變化峻堰,性能好,但是支持方式少盅视。
屬性動畫捐名,通過變化屬性來達(dá)到動畫的效果,性能略差闹击,支持點擊等事件镶蹋。android 3.0
幀動畫,通過drawable一幀幀畫出來赏半。
Gif動畫梅忌,原理同上,canvas畫出來除破。
具體可參考:https://i.cnblogs.com/posts?categoryid=672052
21.如何修改 Activity 進(jìn)入和退出動畫
overridePendingTransition
22.SurfaceView & View 的區(qū)別
view的更新必須在UI thread中進(jìn)行
surfaceview會單獨有一個線程做ui的更新牧氮。
surfaceview 支持open GL繪制。
二瑰枫、項目框架的使用
23.開發(fā)中都使用過哪些框架踱葛、平臺
1.EventBus 事件分發(fā)機(jī)制,由handler實現(xiàn)光坝,線程間通信
2.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
3.百度地圖
4.volley
5.fastjson
6.picciso
7.友盟
8.zxing
9.Gson
24.使用過那些自定義View
pull2RefreshListView
25.自定義控件:繪制圓環(huán)的實現(xiàn)過程
public class CycleView extends View {
Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null);
} public CycleView(Context context, AttributeSet attrs) { super(context, attrs);
initView();
} private void initView() {
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(20);
}
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);
canvas.drawCircle(100,100,50,mPaint);
}
}
關(guān)鍵是canvas.drawCycle & paint.setsytle(stoken)
26.自定義控件:摩天輪的實現(xiàn)過程
27.GridLayout的使用
參考鏈接
https://blog.csdn.net/k316378085/article/details/52316633
28.流式布局的實現(xiàn)過程
參考鏈接
https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1
29.第三方登陸
30.第三方支付
參考鏈接
https://blog.csdn.net/androidstarjack/article/details/72669394
31.進(jìn)程笔蹋活
關(guān)于面試的充分準(zhǔn)備
一些基礎(chǔ)知識和理論肯定是要背的盯另,要理解的背性含,用自己的語言總結(jié)一下背下來。
雖然 Android 沒有前幾年火熱了鸳惯,已經(jīng)過去了會四大組件就能找到高薪職位的時代了商蕴。這只能說明 Android 中級以下的崗位飽和了叠萍,現(xiàn)在高級工程師還是比較缺少的,很多高級職位給的薪資真的特別高(錢多也不一定能找到合適的)绪商,所以努力讓自己成為高級工程師才是最重要的苛谷。
這里附上上述的面試題相關(guān)的幾十套字節(jié)跳動,京東格郁,小米腹殿,騰訊、頭條例书、阿里锣尉、美團(tuán)等公司19年的面試題。把技術(shù)點整理成了視頻和PDF(實際上比預(yù)期多花了不少精力)决采,包含知識脈絡(luò) + 諸多細(xì)節(jié)悟耘。
由于篇幅有限,這里以圖片的形式給大家展示一小部分织狐。
《Android高級教程全套+BAT面試題集+學(xué)習(xí)心得》,石墨文檔可見筏勒;https://shimo.im/docs/qvwWp3dGy8HP6VRG
網(wǎng)上學(xué)習(xí) Android的資料一大堆移迫,但如果學(xué)到的知識不成體系,遇到問題時只是淺嘗輒止管行,不再深入研究厨埋,那么很難做到真正的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對大家有一個方向參考捐顷。
天道酬勤荡陷,只要你想,大廠offer并不是遙不可及迅涮!
希望本篇文章能為你帶來幫助废赞,如果有問題,請在評論區(qū)留言