2020年大公司面試官最常問31道Android基礎(chǔ)題消约,你會多少肠鲫?

這里收集整理的是今年大廠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

  1. 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ī)制 + 廣播

你真正了解UI線程更新的幾種方式嗎榄审,面試必備之深度揭秘

19.子線程中能不能 new handler砌们?為什么

必須可以。子線程 可以new 一個mainHandler搁进,然后發(fā)送消息到UI Thread浪感。

帶你一步一步深入Handler源碼,拿下面試官不在話下

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)過程

參考鏈接
https://github.com/danylovolokh/LondonEyeLayoutManager

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.第三方登陸

參考鏈接
https://blog.csdn.net/alpha58/article/details/75210753

30.第三方支付

參考鏈接
https://blog.csdn.net/androidstarjack/article/details/72669394

31.進(jìn)程笔蹋活

參考鏈接
2018年Android的保活方案效果統(tǒng)計

關(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ū)留言

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叮姑,一起剝皮案震驚了整個濱河市唉地,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌传透,老刑警劉巖耘沼,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異朱盐,居然都是意外死亡群嗤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門兵琳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狂秘,“玉大人骇径,你說我怎么就攤上這事≡甙恚” “怎么了既峡?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碧查。 經(jīng)常有香客問我运敢,道長,這世上最難降的妖魔是什么忠售? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任传惠,我火速辦了婚禮,結(jié)果婚禮上稻扬,老公的妹妹穿的比我還像新娘卦方。我一直安慰自己,他們只是感情好泰佳,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布盼砍。 她就那樣靜靜地躺著,像睡著了一般逝她。 火紅的嫁衣襯著肌膚如雪浇坐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天黔宛,我揣著相機(jī)與錄音近刘,去河邊找鬼。 笑死臀晃,一個胖子當(dāng)著我的面吹牛觉渴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徽惋,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼案淋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了险绘?” 一聲冷哼從身側(cè)響起哎迄,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隆圆,沒想到半個月后漱挚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡渺氧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年旨涝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡白华,死狀恐怖慨默,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情弧腥,我是刑警寧澤厦取,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站管搪,受9級特大地震影響虾攻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜更鲁,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一霎箍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澡为,春花似錦漂坏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拒啰,卻和暖如春驯绎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背图呢。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留骗随,地道東北人蛤织。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鸿染,于是被迫代替她去往敵國和親指蚜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354