標籤:建議 最全 nlog data anon 商務邏輯層 清空 讀取 應用
百度首頁登入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中,Active Manager和視窗管理器這兩個系統服務負責監視應用程式的響應,當使用者操作的在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面試題,你將如何回答?