[轉]Android專家級別的面試總結

Android專家級別的面試總結

1.. 自定義View流程 
onMeasure, onLayout, onDraw, 採用深度優先,由於必須子view得到測量結果,父view才能肯定大小;javascript

2.. 事件分發機制 
https://www.cnblogs.com/aademeng/articles/6551337.htmlhtml

ViewGroup: 
boolean dispatchTouchEvent(){ 
if(onInterceptTouchEvent() && onTouchEvent()){ 
return true; 
}else{ 
return child.dispatchTouchEvent(); 

}java

View:(View若是有OnTouch則先執行且返回true,則被OnTouch消費;不然若是返回false,則看是否可點擊,能夠點擊的話,必定消費,至因而否是onClick消費看是否設置了OnClickListener,沒有的話,就是一個沒有反應的點擊事件;若是不可點擊,則view不消費此事件) 
boolean dispatchTouchEvent(){ 
if(OnTouchListener() && OnTouch()) 
return true; 
else if(clickable()){ 
onClick(); 
return true; 
}else 
return false; 
}android

一個事件系列(即DOWN–>MOVE…MOVE–>UP),若是一旦一個view接受處理此事件,那麼事件系列後續事件直接給它,沒必要再次調用onInterceptTouchEvent.git

若是全部元素都不處理這個事件,那麼這個事件最終會交給Activity去處理,就是Activity的OnTouchEvent方法會被調用github

Activity.java 
/** 
* Called when a touch screen event was not handled by any of the views 
* under it. This is most useful to process touch events that happen 
* outside of your window bounds, where there is no view to receive it. 

* @param event The touch screen event being processed. 

* @return Return true if you have consumed the event, false if you haven’t. 
* The default implementation always returns false. 
*/ 
public boolean onTouchEvent(MotionEvent event) { 
if (mWindow.shouldCloseOnTouch(this, event)) { 
finish(); 
return true; 
}web

return false;
}
  • 1
  • 2
  • 3

3.. Service啓動模式(startService bindService) 
4.. Activity的啓動模式(standard, singleTop, singleTask(Home頁面常使用), singleInstance ) 
5.. Android 動畫有哪幾種?區別? 
1). 幀動畫: 大量圖片播放,耗內存,容易OOM 
2). 補間動畫(Tween動畫或者View動畫):並未真正改變位置 
3). 屬性動畫 :真正改變位置面試

6.. handler, Looper,MessageQueue, Message之間的關係 
7.. 性能優化有哪些方面能夠提升性能的 
View方面: 
佈局減小嵌套, 多使用Drawable, Include, Merge, ViewStub, 
懶加載算法

中間: 
耗時任務放入子線程, 多線程併發的狀況用線程池數據庫

底層: 
DB的大量訪問改成事務處理 
大量HTTP download改成一次性

8.. 如何診斷性能問題(log, TraceView, MAT) 
9.. MVP框架的理解 
10.. 多組件開發 和 插件化開發 的理解 
11.. 熱修復框架,原理?(AndFix, QZone …) 
12.. 自動化測試框架(JUnit, Espresso)

13.. 項目中遇到的最難的問題是什麼?如何解決的? 
1). 有頁面加載時間過長,32s,log發現後臺執行時間28s,緣由for循環裏查詢數據庫組裝數據json,解決辦法:一次性查出全部數據,在內存中操做拼接;->減小至4s;而後把download數據的http接口所有放入一個裏面,減小網絡訪問次數,保存本地DB事務一次性完成,大大提升性能速度,秒進。 
2). 滑動衝突:嵌套滑動的view,解決辦法:外部攔截 + 內部攔截 
3). 曲線畫圖 eChartsJS –>MPAndroidChart 
4). 藍牙兼容性問題 
5). 主頁進入時間過長,致使有黑屏現象。 
解決辦法: 
1. 各個tabFragment懶加載。 
2. 大量計算放入子線程。 
3. SplashFragment方式 
https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650822284&idx=1&sn=d6b30ab442f417cbd992e784945c7799&chksm=80b78212b7c00b049243a474933e7a3f356c8b6fca1e8d67a9fcf654cef095c0c28f6a51e31c&mpshare=1&scene=1&srcid=0313ZLGSBSoiqyxWXffvrchw&key=ff97d989c700b3d86839adc72e98c86494511f6bb644f8efa1370467ffab8ea6a0160388e64873e4dae98227c48bbf423bbf15bc7f3216428c02b6e32ff68c90638921e4a6ceb38f7ad7069ca82d92af&ascene=0&uin=Mzk2Mjg2NTk1&devicetype=iMac+MacBookPro11%2C1+OSX+OSX+10.10+build(14A389)&version=11000003&pass_ticket=Cwf5%2BnPtLYQCdWMfJ6FyPskVFj5bDmdqEr3Qa5G9%2B7ai7nS0YaH0A2yZoMsgtCVz

14.. 用過哪些設計模式 
單例,抽象工廠,觀察者模式,代理模式…

15.. 算法考察

16.. java基礎(synchronize關鍵字理解, 鎖,jvm, 多線程,深拷貝,淺拷貝…)

17.. LRU Cache 算法原理?用的什麼數據結構?(LinkedHashMap, 雙向鏈表,用的強引用能夠控制,最近使用放到隊尾,當達到上限時刪除對頭便可)

18.. Android logcat 裏打出的 GC_FOR_ALLOC等等是什麼意思?LeakCanary檢測內存泄露原理? AndroidAnnotation原理?

19.. HashMap 怎麼實現的?和Hashcode關係?

20.. handler, AsyncTask 區別,什麼狀況用,優缺點。 
都是爲了異步線程而存在,handler實現更輕量級,須要本身實現. AsyncTask更重量級,可是封裝好,使用簡單方便。 
AsyncTask缺點: 
a). 當它爲Activity的非靜態內部類,則若是後臺線程未完成任務,可是Activity已經銷燬,則發生內存泄露。 
b). 當Activity在AsyncTask更新UI前已經銷燬,則崩潰,因此必須在銷燬以前取消 AsyncTask。 
c). 內部是以線程池的方式提供,N+1個。

21.. 哪些狀況會致使內存泄露. 
a). 匿名內部類 
b).沒有unregisterReceiver, EventBus unregister(this)等 
c). 靜態變量持有Context沒有及時賦值爲NULL

22.. 哪些狀況容易OOM,如何有效避免 
a). 大量圖片的加載,inSampleSize, ARGB_8888… 
b). 對象池的複用 convertView 
c). 地圖單車全量加載一次性23M數據,致使ANR,並且因爲作了LoggingInterceptor, EncryptorInterceptor, 在作source.buffer().readString()時須要額外的一樣大小的數組,致使一次性分配OOM。解決的辦法是對於這個接口單獨不作log和加密,或者從產品設計上講把圍欄劃分得更小(最好的方案)消除ANR和數據量大致使的OOM。 
d). 相機掃碼獲取的幀數據進行剪裁和預處理後依然有分配數組OOM。

23.. Https 過程 
http://blog.csdn.net/sean_cd/article/details/6966130

24.. OKhttp 架構圖 
http://blog.csdn.net/apple_hsp/article/details/50964923

25.. Android 哪些Context能startActivity? 
I). Activity能夠直接啓動 
II). Service和Application也能夠啓動,可是必須加上intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
III). BroadcastReceiver 和 ContentProvider 不能直接startActivity,可是能夠 context.startActivity(…), 其中Context看是 I)仍是II)來是否加NEW_TASK_FLAG。Context是註冊receiver的,好比是在Activity中動態註冊的receiver,那麼onReceive裏的context參數就是此Activity;若是是靜態註冊,那麼是applicationContext.

26.. Intent(context, MyActivity.class) 參數的意義 
第一個參數只是爲了獲取App的packageName,在此package中尋找第二個參數MyActivity的實現。因此第一個參數是任意的Context都可,好比activity, service, getApplicationContext()等等。

public Intent(Context packageContext, Class<?> cls) { mComponent = new ComponentName(packageContext, cls); } public ComponentName(Context pkg, Class<?> cls) { mPackage = pkg.getPackageName(); mClass = cls.getName(); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

27.. View CANCEL事件何時觸發? 
當用戶保持按下操做,並從你的控件轉移到外層控件時,會觸發ACTION_CANCEL

28.. View DOWN UP事件的區別? 
一個是點擊下去時觸發,一個起來時觸發

29.. 哪些場景須要多開進程service,爲何? 
通常是爲了App保活,或者新開進程作長鏈接,如JPUSH

30.. 如何解決DNS挾持問題? 
HTTPS

31.. Android第三方工具如Bugly, 友盟,bugtags如何得到Java崩潰異常,和Navtive崩潰,ANR的? 
Java崩潰異常:註冊本身的UnCaughtExceptionHandler 
Navtive崩潰: 在Navtive層Linux會產生異常信號,並且Linux提供了Core Dump機制。經過JNI註冊本身的異常信號捕獲sigaction處理不一樣的信號異常便可。 
具體見http://blog.csdn.net/leeo1010/article/details/50522892 
ANR: 經過在主線程schedule一個runnable, 5秒一次,看看是否執行(好比在runnable計數);是,繼續循環;否,則說明有ANR發生。 
http://blog.csdn.net/gaoanchen/article/details/51914690

ANR的具體信息會被寫入到/data/anr/traces.txt 
https://github.com/SalomonBrys/ANR-WatchDog/tree/master/anr-watchdog

32.. OKhttp有哪幾種攔截Interceptor類型? HTTP重定向是哪一個header? 
I. 應用層的攔截:主要對返回的respondeCode,response內容作處理. addInterceptor() 
II. 網絡層:能夠改變, 增減header等。addNetworkInterceptor() 
HTTP重定向是 Response裏的Location 字段。發生在網絡層。應用層是看不到的,即當有重定向發生時,應用層攔截器只會調用一次,而網絡層攔截器會調用2次。 
https://github.com/square/okhttp/wiki/Interceptors

33.. Android熱更新(HotPatch)方案有哪幾種?區別? 
主要有騰訊的QZone方案(Class級別的替換,Java實現, 無兼容性問題),阿里的AndFix(Method級的替換,JNI—>Native實現替換方法,Art虛擬機兼容性很差)。

34.. JNI命名規則,原理,可否相互調用? 
java能經過JNI調用C,而C不能調用java。

Java 裏調用C:

java: 
public static native int execAL(…);

C++裏對java裏的native的方法命名規則: 
JNIEXPORT int JNICALL Java_[packageName]_[className]_execAL(….); 
j[int, string …] 對應類型

C裏logcat 打log: 
定義宏 #define LOGW(…) android_log_print(ANDROID_LOG, 「jni」, __VA_ARGS)

35.. Java和js可否相互調用? 
能夠。

java調用js: 
mWebView.loadUrl(「javascript:androidCallJS(‘順便傳個參數給JS!’)」);

js調用java: 
webview.addJavascriptInterface(obj, objStr) 
那麼在js裏能夠把objStr當作obj用,調用其任何方法。 
window.objStr.xxx

36.. https 如何提升成功率 
第一次鏈接成功後,能夠在服務器生成一個session key,後續此client再次發起https請求時帶着 sessionID = session key,服務器能夠直接驗證經過,提高了握手效率和成功率。

37.. 爲何選型okhttp,而不是volley? 
okhttp的攔截器比較強大,能夠添加修改header以及針對某些response code作出統一反應。

39.. APK 加殼原理? 
利用加密工具對源APK加密,而後和脫殼程序的DEX合併爲新的DEX,而後替換掉脫殼程序的DEX成爲新的APK,運行時,脫殼程序DEX負責解密源APK,並運行之。

40.. so層安全性? 
so層加密

41.. 插件化中爲定義在宿主app的Manifest中的Activity是如何調起來的? 
I. 在宿主app的Manifest中定義一個fakeActivity 
II. 仍然startActivity(this, Target.class) 
III. 在進入AMS以前HOOK掉Target.class爲fakeActivity, 使其經過AMS對Manifest的檢查,而後出來以後,再次替換爲Target,正確調起來

42.. Parcelable Serializable 區別? 
Serializable 採用變對象爲字節流的方式,能夠持久化在硬盤中,而Parcelable不行。Parcelable本質是經過把對象拆分爲能夠用intent傳輸的方式進行拆解和還原,所以其效率較高。

43.. SparseArray, ArrayMap 和Hashmap區別? 
SparseArray是爲了減小內存的使用,使用key[int], value[Obj],來分別存儲Key和value,沒有浪費內存。使用二分查找來put, delete, 所以效率上稍低,可是對於delete有特殊的對待,只是標記爲delete,無需移位。而Hashmap內部採用了數組+鏈表,以及用hash的方式,會有不少內存空着也要佔用。並且其擴容是2的倍數,且須要從新hash把舊的數據放置在新的table中。其內存使用率比SparseArray低,可是put, delete效率較高。

44.. java中的鎖有? 
Synchronized, ReentrantLock.保證多線程的同步,即操做的原子性。而後,它們還能保證變量的可見性,鎖內使用變量時會去主存獲取最新的變量值,釋放鎖以後把變量最新值從工做內存刷新至主存中。

45.. volatile做用? 
保證變量的可見性,多線程之間使用此變量時,會從主存讀取最新的變量值,而後會把最新的變量值從工做內存刷新至主存中。 
volatile保證有序性。 
https://juejin.im/entry/58d8d57a1b69e6006bbddd5f/view

46.. 外部類和內部類的訪問權限? 
內部類能直接訪問外部類的任何修飾符的成員變量和方法。 
緣由是內部類在編譯期間編譯器會給內部類自動添加一個外部類的成員變量,構造方法參數添加一個外部類參數賦值給其外部類的成員變量。使其持有外部類的對象的引用。 
反之,外部類不能直接訪問內部類的任何修飾符的成員變量和方法。由於,內部類必須依賴於外部類的對象而存在。 
另外,內部類不能擁有static成員變量,道理同上。

47.. 類的修飾能有哪些? 
頂級類只能是public 和default 
內部類均可以修飾, public, protected,private, default(friendly).

48.. 泛型 T, ? 區別? 
T是某一類肯定的類型,?是未知類型。 
?的上邊界extends,只能讀,下邊界super只能插入。 
https://www.zhihu.com/question/20400700

49.. requestLayout, invalidate, postInvalidate 區別? 
http://blog.csdn.net/a553181867/article/details/51583060

50.. FragmentTransaction 裏的 add, replace 區別? 
add不會重建,replace會remove以前此容器裏added過的全部fragment實例,而後再add如今的fragment。 
http://blog.csdn.net/gsw333/article/details/51858524

51.. 線程的啓動方式? 
// MyThread裏的資源不共享 
new MyThread().start()

// m1裏的變量 資源共享 
Runnable m1 = new Runnable(); 
new Thread(m1).start() 
…. 
new Thread(m1).start()

52.. 終止線程的方式? 
I. 共享變量flag法,volatile方式:終止正在運行的線程;可是沒法終止一個被阻塞的線程(由於沒法運行到flag來)。 
II. thread.interrupt() 可使一個被阻塞的線程拋出一箇中斷異常,從而使線程提早結束阻塞狀態,退出堵塞代碼。 
http://www.cnblogs.com/luckygxf/p/4737655.html

53.. Service 與 IntentService 區別? 
IntentService繼承Service,內部在OnCreate時自動建立了一個子線程,裏面維護了一個消息隊列來順序執行每一個onStartCommand的intent。而Service沒有,所以若是在Service的onStartCommand裏啓動一個線程的話, 那麼屢次調用startService會使多個線程併發。

54.. onStartCommand返回值的做用? 
http://blog.csdn.net/taki_dsm/article/details/8865913

55.. 廣播和有序廣播(優先級)區別? 
有序廣播能夠設置優先級來優先獲取廣播(intentFilter.setPriority()),並且可以把處理結果傳遞給下一個廣播優先級接受者setResultExtras(Bundle bundle)/getResultExtras(Bundle bundle),也能夠終止廣播傳播abortBroadcast()。 
http://www.cnblogs.com/codingblock/p/4856559.html

56.. java裏的鎖有哪些? 
synchronized, Lock(ReadWriteLock, ReentrantLock)

57.. surfaceView和View最本質的區別? 
surfaceView是在一個新起的單獨線程中能夠從新繪製畫面,而View必須在UI的主線程中更新畫面. 
http://www.cnblogs.com/lipeil/archive/2012/08/31/2666187.html

58.. onSaveInstanceState何時觸發?在onstop以前嗎? 
在Activity可能被系統殺掉的狀況下觸發,1. 按Home鍵 2. 鎖屏 3. 屏幕旋轉。必然觸發,並且在onPause以後,和onStop以前。而且其中只有屏幕旋轉確定會觸發onRestoreInstanceState,由於Activity真的被殺掉從新生成了。

59.. android 中多進程是共用一個Application嗎仍是不一樣的Application? 
多進程共用一個Application,所以可能會調用屢次同一個Application的onCreate,所以能夠在onCreate里根據不一樣的進程名來判斷執行不一樣的邏輯。

60.. Fragment構造函數,官方只推薦用無參數的,爲何,如何傳值? 
http://www.tuicool.com/articles/j22E3u

相關文章
相關標籤/搜索