接近金三銀四?不要慌,先刷完這幾百道面試題
快到金三銀四了,很多小伙伴還沒有復工,在家呆的有點慌,不知道之后會面臨的裁員還是被裁員。在這里我給大家收集了很多面試題,刷完這些面試題,金三銀四絲毫不用慌了
AndroidBAT面試專題PDF+學習筆記+相對應的視頻教程(見末尾)

一丶Android常問基礎面試點
1.四大組件的生命周期和簡單用法
1)Activity
:
onCreate()
->onStart()
->onResume()
->onPause()
->onStop()
->onDestory()
onCreate()
:為 Activity 設置布局,此時界面還不可見;onStart()
: Activity 可見但還不能與用戶交互,不能獲得焦點onRestart()
: 重新啟動 Activity 時被回調onResume()
: Activity 可見且可與用戶進行交互onPause()
: 當前 Activity 暫停,不可與用戶交互,但還可見。在新 Activity 啟動前被系統(tǒng)調用保存現(xiàn)有的 Activity 中的持久數(shù)據(jù)、停止動畫等。onStop()
: 當 Activity 被新的 Activity 覆蓋不可見時被系統(tǒng)調用onDestory()
: 當 Activity 被系統(tǒng)銷毀殺掉或是由于內(nèi)存不足時調用
2)Service
a)?onBind
?方式綁定的:onCreate
->onBind
->onUnBind
->onDestory
(不管調用?bindService
?幾次,onCreate
?只會調用一次,onStart
?不會被調用,建立連接后,service 會一直運行,直到調用unBindService
?或是之前調用的?bindService
?的 Context 不存在了,系統(tǒng)會自動停止 Service,對
應的?onDestory
?會被調用)
b)?startService
?啟動的:onCreate
->onStartCommand
->onDestory
(start 多次,onCreate
?只會被
調用一次,onStart
會調用多次,該service
會在后臺運行,直至被調用stopService
或是stopSelf
)
c) 又被啟動又被綁定的服務,不管如何調用?onCreate()
只被調用一次,startService
?調用多少
次,onStart
?就會被調用多少次,而?unbindService
?不會停止服務,必須調用?stopService
?或是stopSelf
?來停止服務。必須?unbindService
?和?stopService(stopSelf
)同時都調用了才會停止服
務。
3)BroadcastReceiver
a) 動態(tài)注冊:?存活周期是在?Context.registerReceiver
?和?Context.unregisterReceiver
?之間,BroadcastReceiver
?每次收到廣播都是使用注冊傳入的對象處理的。
b) 靜態(tài)注冊:?進程在的情況下,receiver 會正常收到廣播,調用?onReceive
?方法;生命周期
只存活在onReceive
?函數(shù)中,此方法結束,BroadcastReceiver
?就銷毀了。onReceive()
只有十
幾秒存活時間,在?onReceive()
內(nèi)操作超過 10S,就會報 ANR。進程不存在的情況,廣播相應的進程會被拉活,Application.onCreate
?會被調用,再調用onReceive
。
4)ContentProvider
:
應該和應用的生命周期一樣,它屬于系統(tǒng)應用,應用啟動時,它會跟著初始化,應用關閉或被殺,它會跟著結束。
2 .Activity 之間的通信方式
1)通過 Intent 方式傳遞參數(shù)跳轉
2)通過廣播方式
3)通過接口回調方式
4)借助類的靜態(tài)變量或全局變量
5)借助?SharedPreference
?或是外部存儲,如數(shù)據(jù)庫或本地文件
3.橫豎屏切換的時候,Activity 各種情況下的生命周期
1 ) 切 換 橫 屏 時 :onSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
2) 切換豎屏時:會打印兩次相同的 logonSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
->onSaveInstanceState
->onPause
->onStop
->onDestory
->onCreate
->onStart
->onRestoreInstanceState
->onResume
3) 如 果 在?AndroidMainfest.xml
?中 修 改 該 Activity 的 屬 性 , 添 加android:configChanges="orientation"
橫豎屏切換,打印的 log 一樣,同 1)
如 果?
AndroidMainfest.xml
中 該 Activity 中 的android:configChanges="orientation|keyboardHidden"
,則只會打印onConfigurationChanged
4.Activity 上有 Dialog 的時候按 Home 鍵時的生命周期
AlertDialog
并不會影響Activity的生命周期,按Home鍵后才會使Activity走onPause
->onStop
,AlertDialog
?只是一個組件,并不會使 Activity 進入后臺
5.兩個 Activity 之間跳轉時必然會執(zhí)行的是哪幾個方法?
前一個 Activity 的?onPause
,后一個 Activity 的?onResume
6.Fragment 狀態(tài)保存?onSaveInstanceState
?是哪個類的方法,在什么情況下使用?
在對應的?FragmentActivity.onSaveInstanceState
?方法會調用?FragmentController.saveAllState
,
其中會對?mActive
?中各個 Fragment 的實例狀態(tài)和 View 狀態(tài)分別進行保存.當 Activity 在做狀
態(tài)保存和恢復的時候, 在它其中的 fragment 自然也需要做狀態(tài)保存和恢復.
7.如何實現(xiàn) Fragment 的滑動?
ViewPager+FragmentPagerAdapter+List<Fragment>
8.fragment 之間傳遞數(shù)據(jù)的方式?
1)在相應的 fragment 中編寫方法,在需要回調的 fragment 里獲取對應的 Fragment 實例,調
用相應的方法;
2)采用接口回調的方式進行數(shù)據(jù)傳遞;
a) 在
Fragment1
中創(chuàng)建一個接口及接口對應的set方法;
b) 在Fragment1
中調用接口的方法;
c)在?Fragment2
?中實現(xiàn)該接口;
3)利用第三方開源框架 EventBus
9.說說?ContentProvider
?、ContentResolver
?、ContentObserver
?之間的關系
ContentProvider
?實現(xiàn)各個應用程序間數(shù)據(jù)共享,用來提供內(nèi)容給別的應用操作。如聯(lián)系人應
用中就使用了?ContentProvider
,可以在自己應用中讀取和修改聯(lián)系人信息,不過需要獲取相
應的權限。它也只是一個中間件,真正的數(shù)據(jù)源是文件或 SQLite 等。
ContentResolver
?內(nèi) 容 解 析 者 , 用 于 獲 取 內(nèi) 容 提 供 者 提 供 的 數(shù) 據(jù) , 通 過ContentResolver.notifyChange(uri)
發(fā)出消息
ContentObserve
r 內(nèi)容監(jiān)聽者,可以監(jiān)聽數(shù)據(jù)的改變狀態(tài),觀察特定 Uri 引起的數(shù)據(jù)庫變化,
繼而做一些相應的處理,類似于數(shù)據(jù)庫中的觸發(fā)器,當?ContentObserver
所觀察的 Uri 發(fā)生
變化時,便會觸發(fā)它。
10. 在?manifest
?和代碼中如何注冊和使用?BroadcastReceiver
?
1)mainfest
中注冊:靜態(tài)注冊的廣播接收者就是一個常駐在系統(tǒng)中的全局監(jiān)聽器,也就是說
如果你應用中配置了一個靜態(tài)的?BroadcastReceiver
,而且你安裝了應用而無論應用是否處于
運行狀態(tài),廣播接收者都是已經(jīng)常駐在系統(tǒng)中了。

2 ) 動態(tài)注冊:動態(tài)注冊的廣播接收者只有執(zhí)行了?registerReceiver(receiver, filter)
才會開始監(jiān)聽
廣播消息,并對廣播消息作為相應的處理。

11.Android 屬性動畫特性
12.如何導入外部數(shù)據(jù)庫?
13.LinearLayout、RelativeLayout、FrameLayout 的特性及對比,并介紹使用場景。
14.談談對接口與回調的理解
15.寫一個回調 demo
16.介紹下 SurfView
17.RecycleView 的使用
18.序列化的作用,以及 Android 兩種序列化的區(qū)別
二丶Android View總結
19.View 的滑動方式
a.layout(left,top,right,bottom)
:?通過修改 View 四個方向的屬性值來修改 View 的坐標,從而滑動 View
b.offsetLeftAndRight() offsetTopAndBottom()
:?指定偏移量滑動 view
c.LayoutParams
,改變布局參數(shù):?layoutParams
?中保存了 view 的布局參數(shù),可以通
過修改布局參數(shù)的方式滑動 view
d.通過動畫來移動 view:?注意安卓的平移動畫不能改變 view 的位置參數(shù),屬性
動畫可以
e.scrollTo/scrollBy
:?注意移動的是 view 的內(nèi)容,scrollBy(50,50)
你會看到屏幕上的
內(nèi)容向屏幕的左上角移動了,這是參考對象不同導致的,你可以看作是它移動的
是手機屏幕,手機屏幕向右下角移動,那么屏幕上的內(nèi)容就像左上角移動了
f.scroller
?:scroller
?需要配置?computeScroll
?方法實現(xiàn) view 的滑動,scroller
?本身并不
會滑動 view,它的作用可以看作一個插值器,它會計算當前時間點 view 應該滑
動到的距離,然后 view 不斷的重繪,不斷的調用?computeScroll
?方法,這個方法
是個空方法,所以我們重寫這個方法,在這個方法中不斷的從scroller
?中獲取當
前 view 的位置,調用?scrollTo
?方法實現(xiàn)滑動的效果
20.View 的事件分發(fā)機制
點擊事件產(chǎn)生后,首先傳遞給 Activity 的?dispatchTouchEvent
方法,通過PhoneWindow
?傳遞給?DecorView
,然后再傳遞給根?ViewGroup
,進入?ViewGroup
?的dispatchTouchEvent
?方法,執(zhí)行?onInterceptTouchEvent
?方法判斷是否攔截,再不攔截的情況下,此時會遍歷?ViewGroup
?的子元素,進入子 View 的dispatchToucnEvent
方法,如果子 view 設置了?onTouchListener
,就執(zhí)行onTouch
方法,并根據(jù)?onTouch
?的返回值為 true 還是 false 來決定是否執(zhí)行?onTouchEvent
方法,如果是 false 則繼續(xù)執(zhí)行?onTouchEvent
,在?onTouchEvent
的 Action Up 事件中判斷,如果設置了?onClickListener
?,就執(zhí)行?onClick
?方法。
21.View 的加載流程
View 隨著 Activity 的創(chuàng)建而加載,startActivity
?啟動一個 Activity 時,在ActivityThread
?的handleLaunchActivity
?方法中會執(zhí)行 Activity 的?onCreate
?方法,這個時候會調用?setContentView
加載布局創(chuàng)建出?DecorView
并將我們的 layout加載到?DecorView
?中,當執(zhí)行到?handleResumeActivity
?時,Activity 的?onResume
方法被調用,然后?WindowManager
?會將?DecorView
?設置給?ViewRootImpl
,這樣,DecorView
就被加載到Window中了,此時界面還沒有顯示出來,還需要經(jīng)過 View的 measure,layout 和 draw 方法,才能完成 View 的工作流程。我們需要知道 View的繪制是由ViewRoot
來負責的,每一個DecorView
都有一個與之關聯(lián)的ViewRoot
,這種關聯(lián)關系是由WindowManager
?維護的,將DecorView
和?ViewRoot
?關聯(lián)之后,ViewRootImpl
的requestLayout會被調用以完成初步布局,通過scheduleTraversals
方法向主線程發(fā)送消息請求遍歷,最終調用?ViewRootImpl
的?performTraversals
方法,這個方法會執(zhí)行 View 的?measure layout
?和 draw 流程
三丶技術性面試問題
22)圖片庫對比
23)LRUCache
?原理LruCache
?是個泛型類,主要原理是:把最近使用的對象用強引用存儲在LinkedHashMap
?中,
當緩存滿時,把最近最少使用的對象從內(nèi)存中移除,并提供 get/put 方法完成緩存的獲取和
添加。LruCache
?是線程安全的,因為使用了?synchronized
?關鍵字。當調用 put()方法,將元素加到鏈表頭,如果鏈表中沒有該元素,大小不變,如果沒有,需調用?trimToSize
?方法判斷是否超過最大緩存量,trimToSize()
方法中有一個?while(true)
死循環(huán),如果緩存大小大于最大的緩存值,會不斷刪除?LinkedHashMap
?中隊尾的元素,即最少訪問的,直到緩存大小小于最大緩存值。當調用?LruCache
?的 get 方法時,LinkedHashMap
?會調用recordAccess
方法將此元素加到鏈表頭部。
24 )圖片加載原理
25)自己去實現(xiàn)圖片庫,怎么做?
26) Glide 源碼解析
27) Glide 使用什么緩存?
1) 內(nèi)存緩存:?LruResourceCache(memory)+
弱引用?activeResources
Map<Key
,?WeakReference<EngineResource<?>>> activeResources
?正在使用的資源,當?acquired
變量大于 0,說明圖片正在使用,放到?activeResources
?弱引用緩存中,經(jīng)過 release()后,acquired=0
,說明圖片不再使用,會把它放進?LruResourceCache
?中
2)磁盤緩存:?DiskLruCache
,這里分為 Source(原始圖片)和 Result(轉換后的圖片)
第一次獲取圖片,肯定網(wǎng)絡取,然后存?active\disk
中,再把圖片顯示出來,第二次讀取相同
的圖片,并加載到相同大小的 imageview 中,會先從 memory 中取,沒有再去 active 中獲取。
如果 activity 執(zhí)行到?onStop
?時,圖片被回收,active 中的資源會被保存到 memory 中,active
中的資源被回收。當再次加載圖片時,會從 memory 中取,再放入 active 中,并將 memory
中對應的資源回收。
之所以需要?activeResources
,它是一個隨時可能被回收的資源,memory 的強引用頻繁讀寫
可能造成內(nèi)存激增頻繁 GC,而造成內(nèi)存抖動。資源在使用過程中保存在?activeResources
?中,
而?activeResources
?是弱引用,隨時被系統(tǒng)回收,不會造成內(nèi)存過多使用和泄漏。
28 )Glide 內(nèi)存緩存如何控制大?。?/strong>
Glide 內(nèi)存緩存最大空間(maxSize)=每個進程可用最大內(nèi)存0.4(低配手機是 每個進程可用
最大內(nèi)存0.33)
磁盤緩存大小是 250MB int DEFAULT_DISK_CACHE_SIZE = 250 * 1024 * 1024;
29.網(wǎng)絡框架對比和源碼分析
30.自己去設計網(wǎng)絡請求框架,怎么做?
31.okhttp 源碼
32.網(wǎng)絡請求緩存處理,okhttp 如何處理網(wǎng)絡緩存的;
四丶數(shù)據(jù)庫面試內(nèi)容
33.sqlite 升級,增加字段的語句
34.數(shù)據(jù)庫框架對比和源碼分析
35.數(shù)據(jù)庫的優(yōu)化
36.數(shù)據(jù)庫數(shù)據(jù)遷移問題
五丶算法
排序算法有哪些?
最快的排序算法是哪個?
手寫一個冒泡排序
手寫快速排序代碼
快速排序的過程、時間復雜度、空間復雜度
手寫堆排序
堆排序過程、時間復雜度及空間復雜度
寫出你所知道的排序算法及時空復雜度,穩(wěn)定性
二叉樹給出根節(jié)點和目標節(jié)點,找出從根節(jié)點到目標節(jié)點的路徑
給阿里 2 萬多名員工按年齡排序應該選擇哪個算法?
GC 算法( 各種算法的優(yōu)缺點以及應用場景)
蟻群算法與蒙特卡洛算法
子串包含問題(KMP 算法) 寫代碼實現(xiàn)
一個無序, , 不重復數(shù)組, , 輸出 N 個元素, , 使得 N 個元素的和相加為 M, , 給出時間復雜度、 、.空間復雜度。手寫算法
萬億級別的兩個 URL 文件 A 和 和 B, , 如何求出 A 和 和 B 的差集 C( 提示 :Bit 映射->hash 分組->多文件讀寫效率-> 磁盤尋址以及應用層面對尋址的優(yōu)化)
百度 POI 中如何試下查找最近的商家功能( 提示:坐標鏡像+R 樹) 。
兩個不重復的數(shù)組集合中,求共同的元素。
兩個不重復的數(shù)組集合中,這兩個集合都是海量數(shù)據(jù),內(nèi)存中放不下,怎么求共同的元
素?一個文件中有 100 萬個整數(shù),由空格分開,在程序中判斷用戶輸入的整數(shù)是否在此文件
中。說出最優(yōu)的方法一張 Bitmap 所占內(nèi)存以及內(nèi)存占用的計算
六丶插件化、模塊化、組件化、熱修復、增量更新、Gradle
對熱修復和插件化的理解
插件化原理分析
模塊化實現(xiàn)(好處,原因)
熱修復, 插件化
項目組件化的理解
擊 描述清點擊 Android Studio 的 build 按鈕后發(fā)生了什么
七丶架構設計和設計模式
談談你對 Android 設計模式的理解
MVC MVP MVVM 原理和區(qū)別
你所知道的設計模式有哪些?
項目中常用的設計模式
手寫生產(chǎn)者/ 消費者模式
寫出觀察者模式的代碼
適配器模式,裝飾者模式,外觀模式的異同?
用到的一些開源框架,介紹一個看過源碼的,內(nèi)部實現(xiàn)過程。
71. 談談對 RxJava的理解
RxJava 是基于響應式編程,基于事件流、實現(xiàn)異步操(類似于 Android 中的?AsyncTask
、Handler
作用)作的庫,基于事件流的鏈式調用,使得 RxJava 邏輯簡潔、使用簡單。RxJava 原理是
基于一種擴展的觀察者模式,
有四種角色:?被觀察者?Observable
?觀察者?Observer
?訂閱subscribe
?事件 Event。
RxJava
?原理可總結為:?被觀察者 Observable 通過訂閱(subscribe)按順序發(fā)送事件(Emitter)給觀察者(Observer), 觀察者按順序接收事件&作出相應的響應動作
RxJava 中的操作符:
1)defer()
:?直到有觀察者(Observer
)訂閱時,才會動態(tài)創(chuàng)建被觀察者對象(Observer
)&發(fā)送事件,通過?Observer
?工廠方法創(chuàng)建被觀察者對象,每次訂閱后,都會得到一個剛創(chuàng)建的最新的
Observer 對象,可以確保 Observer 對象里的數(shù)據(jù)是最新的。defer()
方法只會定義?Observable
對象,只有訂閱操作才會創(chuàng)建對象。
?

2)timer()
?快速創(chuàng)建一個被觀察者(Observable
),延遲指定時間后,再發(fā)送事件

3)interval() intervalRange()
?快速創(chuàng)建一個被觀察者對象(Observable),每隔指定時間就發(fā)送
事件

72.Rxjava 發(fā)送事件步驟
1)創(chuàng)建被觀察者對象 Observable&定義需要發(fā)送的事件

Observable.create()
方法實際創(chuàng)建了一個?ObservableCreate
?對象,它是?Observable
?的子類,傳
入一個?ObservableOnSubscribe
?對象,復寫了發(fā)送事件行為的?subscribe()
方法。
2)創(chuàng)建觀察者對象 Observer&定義響應事件的行為

3)通過subscribe()
方法使觀察者訂閱被觀察者

RxJava 的作用,與平時使用的異步操作來比的優(yōu)缺點
說說 EventBus 作用,實現(xiàn)方式,代替 EventBus 的方式
從 從 0 設計一款 App 整體架構,如何去做?
說一款你認為當前比較火的應用并設計( 比如:直播 APP ,P2P 金融,小視頻等)
談談對 java 狀態(tài)機理解
Fragment 如果在 Adapter 中使用應該如何解耦?
Binder 機制及底層實現(xiàn)
對于應用更新這塊是如何做的?( 解答:灰度,強制更新,分區(qū)域更新) ?
實現(xiàn)一個 Json 解析器
八丶性能優(yōu)化
如何對 Android 應用進行性能分析以及優(yōu)化?
ddms 和 和 traceView
性能優(yōu)化如何分析 systrace ?
用 用 IDE 如何分析內(nèi)存泄漏?
Java 多線程引發(fā)的性能問題,怎么解決?
啟動頁白屏及黑屏解決?
啟動太慢怎么解決?
怎么保證應用啟動不卡頓?
App 啟動崩潰異常捕捉
自定義 View 注意事項
現(xiàn)在下載速度很慢, 試從網(wǎng)絡協(xié)議的角度分析原因, 并優(yōu)化( 提示: : 網(wǎng)絡的 的 5 層都可以涉及)。
Https 請求慢的解決辦法(提示:DNS ,攜帶數(shù)據(jù),直接訪問 IP )
如何保持應用的穩(wěn)定性
RecyclerView 和 和 ListView 的性能對比
ListView 的優(yōu)化
RecycleView 優(yōu)化
View 渲染
Bitmap 如何處理大圖,如一張 30M 的大圖,如何預防 OOM
java 中的四種引用的區(qū)別以及使用場景
強引用置為 null ,會不會被回收?
更多信息可以點擊關于我?, 非常希望和大家一起交流 , 共同進步
(順手留下GitHub鏈接,需要獲取相關面試等內(nèi)容的可以自己去找)
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)
