1. 程式人生 > >2017年最全的30個Android面試題,你將如何回答?

2017年最全的30個Android面試題,你將如何回答?

fab reat 屬於 微信公眾號 ber 什麽是 進入 細節 註意

技術分享圖片 百度首頁 登錄

2017年最全的30個Android面試題,你將如何回答?

技術分享圖片

機翼技術

百家號 03-10 02:32

“三金四銀”又是一年一度的跳槽季,相信有不少Android程序員開始摩拳擦掌蠢蠢欲動了。然而,面對面試官的問題,你將如何回答?

技術分享圖片

一、如何理解Activity,View,Window三者之間的關系?

這個問題真的很不好回答。所以先比較恰當的比喻來形容下它們的關系,Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。

1:Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。

2:這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。

3:“ViewRoot”通過addView方法來一個個的添加View。比如TextView,Button等

4:這些View的事件監聽,是由WindowManagerService來接受消息,並且回調Activity函數。比如onClickListener,onKeyDown等。

二、Activity的幾種LaunchMode及使用場景

1、standard 模式

這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。使用場景:大多數Activity。

2、singleTop 模式

如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。使用場景如新聞類或者閱讀類App的內容頁面。

3、singleTask 模式

如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。使用場景如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其余情況都會走onNewIntent,並且會清空主界面上面的其他頁面。

4、singleInstance 模式

在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用於中間頁面,如果用於中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出後,在此啟動,首先打開的是B。

三、Android中的動畫有哪幾類

Android3.0之前有2種,3.0後有3種。

FrameAnimation(逐幀動畫):將多張圖片組合起來進行播放,類似於早期電影的工作原理,很多App的loading是采用這種方式。

TweenAnimation(補間動畫):是對某個View進行一系列的動畫的操作,包括淡入淡出(Alpha),縮放(Scale),平移(Translate),旋轉(Rotate)四種模式。

PropertyAnimation(屬性動畫):屬性動畫不再僅僅是一種視覺效果了,而是一種不斷地對值進行操作的機制,並將值賦到指定對象的指定屬性上,可以是任意對象的任意屬性。

http://blog.csdn.net/yanbober/article/details/46481171

四、請描述下Activity的生命周期

這個問題關鍵是理解。有人曾遇到這個問題的變種問題,問onStart(),與onResume()有什麽區別?如果面試官拋出這個問題,是不是有點措手不及。最近又有人遭遇了更變態的問題:什麽情況下Activity走了onCreat(),而不走onStart()。

五、請介紹下service生命周期

這裏要註意service有兩種啟動方式,startService()和bindService()

技術分享圖片

六、View的繪制流程

measure過程、layout過程、draw過程

http://blog.csdn.net/yanbober/article/details/46128379/

七、Android的四大組件是哪些,各自都有什麽作用?

Activity:Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期以及一些跳轉邏輯。

service:後臺服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事物,定義好需要接受的Intent提供同步和異步的接口。

Content Provider:是Android提供的第三方應用數據的訪問方案,可以派生Content Provider類,對外提供數據,可以像數據庫一樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統一的借口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑。

BroadCast Receiver:接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型。

八、ListView的優化方案

1、如果自定義適配器,那麽在getView方法中要考慮方法傳進來的參數contentView是否為null,如果為null就創建contentView並返回,如果不為null則直接使用。在這個方法中盡可能少創建view。

2、給contentView設置tag(setTag()),傳入一個viewHolder對象,用於緩存要顯示的數據,可以達到圖像數據異步加載的效果。

3、如果listview需要顯示的item很多,就要考慮分頁加載。

九、請問Android中跨進程通訊有幾種方式

1:訪問其他應用程序的Activity,如調用系統通話應用IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");startActivity(callIntent);

2:Content Provider,如訪問系統相冊

3:廣播(Broadcast),如顯示系統時間

4:AIDL服務

十、說說mvc模式的原理,它在android中的運用,android的官方建議應用程序的開發采用mvc模式。

mvc是model,view,controller的縮寫,mvc包含三個部分:

1)模型(model)對象:是應用程序的主體部分,所有的業務邏輯都應該寫在該層。

2)視圖(view)對象:是應用程序中負責生成用戶界面的部分。也是在整個mvc架構中用戶唯一可以看到的一層,接收用戶的輸入,顯示處理結果。

3)控制器(control)對象:是根據用戶的輸入,控制用戶界面數據顯示及更新model對象狀態的部分,控制器更重要的一種導航功能,響應用戶出發的相關事件,交給m層處理。

android鼓勵弱耦合和組件的重用,在android中mvc的具體體現如下:

1)視圖層(view):一般采用xml文件進行界面的描述,使用的時候可以非常方便的引入,當然,如果你對android了解的比較的多了話,就一定可以想到在android中也可以使用JavaScript+html等的方式作為view層,當然這裏需要進行java和javascript之間的通信,幸運的是,android提供了它們之間非常方便的通信實現。

2)控制層(controller):android的控制層的重任通常落在了眾多的acitvity的肩上,這句話也就暗含了不要在acitivity中寫代碼,要通過activity交割model業務邏輯層處理,這樣做的另外一個原因是android中的acitivity的響應時間是5s,如果耗時的操作放在這裏,程序就很容易被回收掉。

3)模型層(model):對數據庫的操作、對網絡等的操作都應該在model裏面處理,當然對業務計算等操作也是必須放在的該層的。

十一、什麽情況會導致Force Close ?如何避免?能否捕獲導致其的異常?

程序出現異常,比如nullpointer。如何避免:編寫程序時邏輯連貫,思維縝密。能捕獲異常,在logcat中能看到異常信息

十二、Touch事件的傳遞機制publicbooleandispatchTouchEvent(MotionEventev); //用來分派eventpublicbooleanonInterceptTouchEvent(MotionEventev);//用來攔截eventpublicbooleanonTouchEvent(MotionEventev);//用來處理event

其中Activity和View控件(TextView)擁有分派和處理事件方法,View容器(LinearLayout)具有分派,攔截,處理事件方法。這裏也有個比喻:領導都會把任務向下分派,一旦下面的人把事情做不好,就不會再把後續的任務交給下面的人來做了,只能自己親自做,如果自己也做不了,就只能告訴上級不能完成任務,上級又會重復他的過程。另外,領導都有權利攔截任務,對下級隱瞞該任務,而直接自己去做,如果做不成,也只能向上級報告不能完成任務。

http://gold.xitu.io/entry/56af0ba0c24aa800547b60ea

http://blog.csdn.net/morgan_xww/article/details/9372285

十三、請說一下Android UI適配問題

hongyang大神的方案:http://blog.csdn.net/lmj623565791/article/details/45460089

十四、請介紹一下JAVA註解反射原理是什麽

參考:http://www.jianshu.com/p/3968ffabdf9d

十五、請說下數據庫優化問題

參考:http://www.jianshu.com/p/3b4452fc1bbd

十六、請介紹下ContentProvider是如何實現數據共享的

一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。

要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型並且有寫入Content provider的權限。

如何通過一套標準及統一的接口獲取其他應用程序暴露的數據?

Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。

十七、HybridJAVA 與JS交互

參考:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/

十八、請介紹下Java GC原理

參考:http://www.jianshu.com/p/d75a32ac5bed?

十九、如何將一個Activity設置成窗口的樣式。

中配置:android :theme="@android:style/Theme.Dialog"

另外android:theme="@android:style/Theme.Translucent" 是設置透明

二十、JAVA註解反射原理問題

二十一、什麽是ANR 如何避免它?

ANR:Application Not Responding。在Android中,活動管理器和窗口管理器這兩個系統服務負責監視應用程序的響應,當用戶操作的在5s內應用程序沒能做出反應,BroadcastReceiver在10秒內沒有執行完畢,就會出現應用程序無響應對話框,這既是ANR。

避免方法:Activity應該在它的關鍵生命周期方法(如onCreate()和onResume())裏盡可能少的去做創建操作。潛在的耗時操作,例如網絡或數據庫操作,或者高耗時的計算如改變位圖尺寸,應該在子線程裏(或者異步方式)來完成。主線程應該為子線程提供一個Handler,以便完成時能夠提交給主線程。

二十二、設計模式

參考:http://gold.xitu.io/entry/56ebb4ad5bbb50004c440972

二十三、Android本身的api並未聲明會拋出異常,則其在運行時有無可能拋出runtime異常,你遇到過嗎?諾有的話會導致什麽問題?是如何解決的?

會,比如nullpointerException。我遇到過,比如textview.setText()時,textview沒有初始化。會導致程序無法正常運行出現forceclose。打開控制臺查看logcat信息找出異常信息並修改程序。

二十四、RxJava

http://gank.io/post/560e15be2dca930e00da1083?from=timeline&isappinstalled=0#toc_1

二十五、Http Https

http://www.jianshu.com/p/93fdebe5fef1

二十六、java中如何引用本地語言

可以用JNI(java native interface java 本地接口)接口 。

二十七、Android內存泄露及管理

http://gold.xitu.io/entry/56d64b9e816dfa005943a55c

二十八、設計一套圖片異步加載緩存方案

http://www.cnblogs.com/zyw-205520/p/4997863.html

http://blog.csdn.net/boyupeng/article/details/47127605

二十九、Android 中有哪幾種解析xml的類?官方推薦的是哪種?它們的原理是什麽,區別在哪?

答:XML解析主要有三種方式,SAX、DOM、PULL。常規在PC上開發我們使用Dom相對輕松些,但一些性能敏感的數據庫或手機上還是主要采用SAX方式,SAX讀取是單向的,優點:不占內存空間、解析屬性方便,但缺點就是對於套嵌多個分支來說處理不是很方便。而DOM方式會把整個XML文件加載到內存中去,這裏Android開發網提醒大家該方法在查找方面可以和XPath很好的結合如果數據量不是很大推薦使用,而PULL常常用在J2ME對於節點處理比較好,類似SAX方式,同樣很節省內存,在J2ME中我們經常使用的KXML庫來解析。

三十、熱修復的原理

1:JavaSisst

2:AspectJ

3:Xposef

http://mp.weixin.qq.com/s?__biz=MzA3Mjk1MjA4Nw==&mid=400452659&idx=1&sn=841b49b875ec3b307f261ed52a7d9c4e&scene=23&srcid=1119JWRt0adNwGxTHiyok460#rd

約聘網,垂直於互聯網行業的O2O求職招聘平臺。專註於運營、推廣、營銷、SEO、SEM、BD、產品經理、技術開發等職位招聘。關註約聘網微信公眾號yuepin51 獲取最新最全面求職招聘信息,發布只屬於您的微簡歷、微招聘。

2017年最全的30個Android面試題,你將如何回答?