android技術交流群:747425162
整理下碰到的一些面試題和基礎知識
目錄列出來,答案在
https://github.com/huangruiLearn/hrl_android_notes
1. Android
1.Activity
- 1.Activity的啟動流程
- 2.onSaveInstanceState(),onRestoreInstanceState的掉用時機
- 3.activity的啟動模式和使用場景
- 4.Activity A跳轉Activity B,再按返回鍵,生命周期執行的順序
- 5.橫豎屏切換,按home鍵,按返回鍵,鎖屏與解鎖屏幕,跳轉透明Activity界面,啟動一個 Theme 為 Dialog 的 Activity,彈出Dialog時Activity的生命周期
- 6.onStart 和 onResume、onPause 和 onStop 的區別
- 7.Activity之間傳遞數據的方式Intent是否有大小限制,如果傳遞的數據量偏大,有哪些方案
- 8.Activity的onNewIntent()方法什么時候會執行
- 9.顯示啟動和隱式啟動
- 10.scheme使用場景,協議格式,如何使用
- 11.ANR 的四種場景
- 12.onCreate和onRestoreInstance方法中恢復數據時的區別
- 13.activty間傳遞數據的方式
- 14.跨App啟動Activity的方式,注意事項
- 15.Activity任務棧是什么
- 16.有哪些Activity常用的標記位Flags
- 17.Activity的數據是怎么保存的,進程被Kill后,保存的數據怎么恢復的
2.Service
- 1.service 的生命周期,兩種啟動方式的區別
- 2.Service啟動流程
- 3.Service與Activity怎么實現通信
- 4.IntentService是什么,IntentService原理,應用場景及其與Service的區別
- 5.Service 的 onStartCommand 方法有幾種返回值?各代表什么意思?
- 6.bindService和startService混合使用的生命周期以及怎么關閉
3.BroadcastReceiver
- 1.廣播的分類和使用場景
- 2.廣播的兩種注冊方式的區別
- 3.廣播發送和接收的原理
- 4.本地廣播和全局廣播的區別
4.ContentProvider
- 1.什么是ContentProvider及其使用
- 2.ContentProvider,ContentResolver,ContentObserver之間的關系
- 3.ContentProvider的實現原理
- 4.ContentProvider的優點
- 5.Uri 是什么
5.Handler
- 1.Handler的實現原理
- 2.子線程中能不能直接new一個Handler,為什么主線程可以
????主線程的Looper第一次調用loop方法,什么時候,哪個類 - 3.Handler導致的內存泄露原因及其解決方案
- 4.一個線程可以有幾個Handler,幾個Looper,幾個MessageQueue對象
- 5.Message對象創建的方式有哪些 & 區別?
????Message.obtain()怎么維護消息池的 - 6.Handler 有哪些發送消息的方法
- 7.Handler的post與sendMessage的區別和應用場景
- 8.handler postDealy后消息隊列有什么變化,假設先 postDelay 10s, 再postDelay 1s, 怎么處理這2條消息
- 9.MessageQueue是什么數據結構
- 10.Handler怎么做到的一個線程對應一個Looper,如何保證只有一個MessageQueue
???????ThreadLocal在Handler機制中的作用 - 11.HandlerThread是什么 & 好處 &原理 & 使用場景
- 12.IdleHandler及其使用場景
- 13.消息屏障,同步屏障機制
- 14.子線程能不能更新UI
- 15.為什么Android系統不建議子線程訪問UI
- 16.Android中為什么主線程不會因為Looper.loop()里的死循環卡死
?????MessageQueue#next 在沒有消息的時候會阻塞,如何恢復? - 17.Handler消息機制中,一個looper是如何區分多個Handler的
???????當Activity有多個Handler的時候,怎么樣區分當前消息由哪個Handler處理
???????處理message的時候怎么知道是去哪個callback處理的 - 18.Looper.quit/quitSafely的區別
- 19.通過Handler如何實現線程的切換
- 20.Handler 如何與 Looper 關聯的
- 21.Looper 如何與 Thread 關聯的
- 22.Looper.loop()源碼
- 23.MessageQueue的enqueueMessage()方法如何進行線程同步的
- 24.MessageQueue的next()方法內部原理
- 25.子線程中是否可以用MainLooper去創建Handler,Looper和Handler是否一定處于一個線程
- 26.ANR和Handler的聯系
6.View繪制
- 1.View繪制流程
- 2.MeasureSpec是什么
- 3.子View創建MeasureSpec創建規則是什么
- 4.自定義Viewwrap_content不起作用的原因
- 5.在Activity中獲取某個View的寬高有幾種方法
- 6.為什么onCreate獲取不到View的寬高
- 7.View#post與Handler#post的區別
- 8.Android繪制和屏幕刷新機制原理
- 9.Choreography原理
- 10.什么是雙緩沖
- 11.為什么使用SurfaceView
- 12.什么是SurfaceView
- 13.View和SurfaceView的區別
- 14.SurfaceView為什么可以直接子線程繪制
- 15.SurfaceView、TextureView、SurfaceTexture、GLSurfaceView
- 16.getWidth()方法和getMeasureWidth()區別
- 17.invalidate() 和 postInvalidate() 的區別
- 18.Requestlayout,onlayout,onDraw,DrawChild區別與聯系
- 19.LinearLayout、FrameLayout 和 RelativeLayout 哪個效率高
- 20.LinearLayout的繪制流程
- 21.自定義 View 的流程和注意事項
- 22.自定義View如何考慮機型適配
- 23.自定義控件優化方案
- 24.invalidate怎么局部刷新
- 25.View加載流程(setContentView)
7.View事件分發
- 1.View事件分發機制
- 2.view的onTouchEvent,OnClickListerner和OnTouchListener的onTouch方法 三者優先級
- 3.onTouch 和onTouchEvent 的區別
- 4.ACTION_CANCEL什么時候觸發
- 5.事件是先到DecorView還是先到Window
- 6.點擊事件被攔截,但是想傳到下面的View,如何操作
- 7.如何解決View的事件沖突
- 8.在 ViewGroup 中的 onTouchEvent 中消費 ACTION_DOWN 事件,ACTION_UP事件是怎么傳遞
- 9.Activity ViewGroup和View都不消費ACTION_DOWN,那么ACTION_UP事件是怎么傳遞的
- 10.同時對父 View 和子 View 設置點擊方法,優先響應哪個
- 11.requestDisallowInterceptTouchEvent的調用時機
8.RecycleView
- 1.RecyclerView的多級緩存機制,每一級緩存具體作用是什么,分別在什么場景下會用到哪些緩存
- 2.RecyclerView的滑動回收復用機制
- 3.RecyclerView的刷新回收復用機制
- 4.RecyclerView 為什么要預布局
- 5.ListView 與 RecyclerView區別
- 6.RecyclerView性能優化
9.Viewpager&Fragment
- 1.Fragment的生命周期 & 結合Activity的生命周期
- 2.Activity和Fragment的通信方式, Fragment之間如何進行通信
- 3.為什么使用Fragment.setArguments(Bundle)傳遞參數
- 4.FragmentPageAdapter和FragmentStatePageAdapter區別及使用場景
- 5.Fragment懶加載
- 6.ViewPager2與ViewPager區別
- 7.Fragment嵌套問題
10.WebView
11.動畫
- 1.動畫的類型
- 2.補間動畫和屬性動畫的區別
- 3.ObjectAnimator,ValueAnimator及其區別
- 4.TimeInterpolator插值器,自定義插值器
- 5.TypeEvaluator估值器
12.Bitmap
- 1.Bitmap 內存占用的計算
- 2.getByteCount() & getAllocationByteCount()的區別
- 3.Bitmap的壓縮方式
- 4.LruCache & DiskLruCache原理
- 5.如何設計一個圖片加載庫
- 6.有一張非常大的圖片,如何去加載這張大圖片
- 7.如果把drawable-xxhdpi下的圖片移動到drawable-xhdpi下,圖片內存是如何變的。
- 8.如果在hdpi、xxhdpi下放置了圖片,加載的優先級。如果是400800,10801920,加載的優先級。
13.mvc&mvp&mvvm
14.Binder
- 1.Android中進程和線程的關系,區別
- 2.為何需要進行IPC,多進程通信可能會出現什么問題
- 3.Android中IPC方式有幾種、各種方式優缺點
- 4.為何新增Binder來作為主要的IPC方式
- 5.什么是Binder
- 6.Binder的原理
????Binder Driver 如何在內核空間中做到一次拷貝的? - 7.使用Binder進行數據傳輸的具體過程
- 8.Binder框架中ServiceManager的作用
- 9.什么是AIDL
- 10.AIDL使用的步驟
- 11.AIDL支持哪些數據類型
- 12.AIDL的關鍵類,方法和工作流程
- 13.如何優化多模塊都使用AIDL的情況
- 14.使用 Binder 傳輸數據的最大限制是多少,被占滿后會導致什么問題
- 15.Binder 驅動加載過程中有哪些重要的步驟
- 16.系統服務與bindService啟動的服務的區別
- 17.Activity的bindService流程
- 18.不通過AIDL,手動編碼來實現Binder的通信
15.內存泄漏&內存溢出
- 1.什么是OOM & 什么是內存泄漏以及原因
- 2.Thread是如何造成內存泄露的,如何解決?
- 3.Handler導致的內存泄露的原因以及如何解決
- 4.如何加載Bitmap防止內存溢出
- 5.MVP中如何處理Presenter層以防止內存泄漏的
16.性能優化
17.Window&WindowManager
- 1.什么是Window
- 2.什么是WindowManager
- 3.什么是ViewRootImpl
- 4.什么是DecorView
- 5.Activity,View,Window三者之間的關系
- 6.DecorView什么時候被WindowManager添加到Window中
18.WMS
- 1.什么是WMS
- 2.WMS是如何管理Window的
- 3.IWindowSession是什么,WindowSession的創建過程是怎樣的
- 4.WindowToken是什么
- 5.WindowState是什么
- 6.Android窗口大概分為幾種?分組原理是什么
- 7.Dialog的Context只能是Activity的Context,不能是Application的Context
- 8.App應用程序如何與SurfaceFlinger通信的
View 的繪制是如何把數據傳遞給 SurfaceFlinger 的 - 9.共享內存的具體實現是什么
- 10.relayout是如何向SurfaceFlinger申請Surface
- 11.什么是Surface
19.AMS
- 1.ActivityManagerService是什么?什么時候初始化的?有什么作用?
- 2.ActivityThread是什么?ApplicationThread是什么?他們的區別
- 3.Instrumentation是什么?和ActivityThread是什么關系?
- 4.ActivityManagerService和zygote進程通信是如何實現的
- 5.ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord
- 6.ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的關系
- 7.手寫實現簡化版AMS
20.系統啟動
- 1.android系統啟動流程
- 2.SystemServer,ServiceManager,SystemServiceManager的關系
- 3.孵化應用進程這種事為什么不交給SystemServer來做,而專門設計一個Zygote
- 4.Zygote的IPC通信機制為什么使用socket而不采用binder
21.App啟動&打包&安裝
22.序列化
- 1.什么是序列化
- 2.為什么需要使用序列化和反序列化
- 3.序列化的有哪些好處
- 4.Serializable 和 Parcelable 的區別
- 5.什么是serialVersionUID
- 6.為什么還要顯示指定serialVersionUID的值?
23.Art & Dalvik 及其區別
24.模塊化&組件化
25.熱修復&插件化
26.AOP
27.jectpack
- 1.Navigation
- 2.DataBinding
- 3.Viewmodel
- 4.livedata
- 5.liferecycle
28.開源框架
- 1.Okhttp源碼流程,線程池
- 2.Okhttp攔截器,addInterceptor 和 addNetworkdInterceptor區別
- 3.Okhttp責任鏈模式
- 4.Okhttp緩存怎么處理
- 5.Okhttp連接池和socket復用
- 6.Glide怎么綁定生命周期
- 7.Glide緩存機制,內存緩存,磁盤緩存
- 8.Glide與Picasso的區別
- 9.LruCache原理
- 10.Retrofit源碼流程,動態代理
- 11.LeakCanary弱引用,源碼流程
- 12.Eventbus
- 13.Rxjava
2.Java
1.HashMap
- 1.HashMap原理
- 2.HashMap中put()如何實現的
- 3.HashMap中get()如何實現的
- 4.為什么HashMap線程不安全
- 5.HashMap1.7和1.8有哪些區別
- 6.解決hash沖突的時候,為什么用紅黑樹
- 7.紅黑樹的效率高,為什么一開始不用紅黑樹存儲
- 8.不用紅黑樹,用二叉查找樹可以不
- 9.為什么閥值是8才轉為紅黑樹
- 10.為什么退化為鏈表的閾值是6
- 11.hash沖突有哪些解決辦法
- 12.HashMap在什么條件下擴容
- 13.HashMap中hash函數怎么實現的,還有哪些hash函數的實現方式
- 14.為什么不直接將hashcode作為哈希值去做取模,而是要先高16位異或低16位
- 15.為什么擴容是2的次冪
- 16.鏈表的查找的時間復雜度是多少
- 17.紅黑樹
2.ArrayList
3.Jvm
4.多線程
- 1.Java中創建線程的方式,Callable,Runnable,Future,FutureTask
- 2.線程的幾種狀態
- 3.談談線程死鎖,如何有效的避免線程死鎖?
- 4.如何實現多線程中的同步
- 5.synchronized和Lock的使用、區別,原理;
- 6.volatile,synchronized和volatile的區別?為何不用volatile替代synchronized?
- 7.鎖的分類,鎖的幾種狀態,CAS原理
- 8.為什么會有線程安全?如何保證線程安全
- 9.sleep()與wait()區別,run和start的區別,notify和notifyall區別,鎖池,等待池
- 10.Java多線程通信
- 11.為什么Java用線程池
- 12.Java中的線程池參數,共有幾種
5.注解
- 1.注解的分類和底層實現原理
- 2.自定義注解
6.反射
- 1.什么是反射
- 2.反射機制的相關類
- 3.反射中如何獲取Class類的實例
- 4.如何獲取一個類的屬性對象 & 構造器對象 & 方法對象
- 5.Class.getField和getDeclaredField的區別,getDeclaredMethod和getMethod的區別
- 6.反射機制的優缺點