寫在前面
1月初失業,找了近2個多月的工作了,還沒找到心儀的工作,感覺心好慌,不知道該怎么辦了?找不到工作的時候壓力很大,有人說自信會很受打擊,還有人說會很絕望,是人生的低谷……盡管很多時候我們自己知道,我不是找不到工作,只是找不到理想中的好工作。但這也不能改變你的空白期正在一天一天變長,不妥協的那份堅定正在一天一天動搖的事實。
朋友推薦給我這份文檔,狂刷五遍之后,最近剛剛獲得字節跳動等多家公司的offer,今天將這份文檔分享給大家,希望正在找工作或準備找工作的朋友都可以獲得自己心儀公司的offer。
正文如下
- Activity面試題
- Fragment面試題
- Service面試題
- Broadcast Receiver面試題
- WebView面試題
- Binder面試題
- Handler面試題
- AsyncTask面試題
- HandlerThread面試題
- IntentService面試題
- 視圖工作機制面試題
- 事件分發機制面試題
- ListView面試題
- Android項目構建面試題(由于篇幅太長,今天就先分享到這里)
- ANR面試題
- OOM面試題
- Bitmap面試題
- UI卡頓面試題
- 內存泄漏面試題
- 內存管理面試題
- 冷啟動和熱啟動面試題
- 其他優化面試題
- 架構模式面試題
- 插件化面試題
- 熱更新面試題
- 進程保活面試題
- Lint面試題
- Kotlin面試題
Activity面試題
1、Activity是什么
Activity是四大組件之一,它提供一個界面讓用戶點擊和各種滑動操作,這就是Activity
2、Activity四種狀態
- runing
- paused
- stopped
- killed
3、Activity生命周期
- onCreate()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onRestart()
4、進程的優先級
- 空進程
- 后臺進程
- 服務進程
- 可見進程
- 前臺進程
5、Activity任務棧
- 先進后出
6、Activity啟動模式
- standard
- singletop
- singletask
- singleinstance
7、scheme跳轉協議
Android中的scheme是一種頁面內跳轉協議,通過定義自己的scheme協議,可以跳轉到app中的各個頁面
- 服務器可以定制化告訴app跳轉哪個頁面
- App可以通過跳轉到另一個App頁面
- 可以通過H5頁面跳轉頁面
Fragment面試題
1、Fragment為什么被稱為第五大組件
Fragment比Activity更節省內存,其切換模式也更加舒適,使用頻率不低于四大組件,且有自己的生命周期,而且必須依附于Activity
2、Activity創建Fragment的方式
- 靜態創建
- 動態創建
3、FragmentPageAdapter和FragmentPageStateAdapter的區別
-
FragmentPageAdapter在每次切換頁面的的時候,是將Fragment進行分離,適合頁面較少的Fragment使用以保存一些內存,對系統內存不會多大影響
-
FragmentPageStateAdapter在每次切換頁面的時候,是將Fragment進行回收,適合頁面較多的Fragment使用,這樣就不會消耗更多的內存
4、Fragment生命周期
- onAttach()
- onCreate()
- onCreateView()
- onActivityCreated()
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroyView()
- onDestroy()
- onDetach()
5、Fragment的通信
- Fragment調用Activity中的方法:getActivity
- Activity調用Fragment中的方法:接口回調
- Fragment調用Fragment中的方法:FragmentManager.findFragmentById
6、Fragment的replace、add、remove方法
- replace:替代Fragment的棧頂頁面
- add:添加Fragment到棧頂頁面
- remove:移除Fragment棧頂頁面
Service面試題
1、Service是什么
Service是四大組件之一,它可以在后臺執行長時間運行操作而沒有用戶界面的應用組件
2、Service和Thread的區別
-
Service是安卓中系統的組件,它運行在獨立進程的主線程中,不可以執行耗時操作。Thread是程序執行的最小單元,分配CPU的基本單位,可以開啟子線程執行耗時操作
-
Service在不同Activity中可以獲取自身實例,可以方便的對Service進行操作。Thread在不同的Activity中難以獲取自身實例,如果Activity被銷毀,Thread實例就很難再獲取得到
3、Service啟動方式
- startService
- bindService
4、Service生命周期
- startService
- onCreate()
- onStartCommand()
- onDestroy()
- bindService
- onCreate()
- onBind()
- onUnbind()
- onDestroy()
Broadcast Receiver面試題
1、Broadcast Receiver是什么
Broadcast是四大組件之一,是一種廣泛運用在應用程序之間傳輸信息的機制,通過發送Intent來傳送我們的數據
2、Broadcast Receiver的使用場景
- 同一App具有多個進程的不同組件之間的消息通信
- 不同App之間的組件之間的消息通信
3、Broadcast Receiver的種類
- 普通廣播
- 有序廣播
- 本地廣播
- Sticky廣播
4、Broadcast Receiver的實現
-
靜態注冊:注冊后一直運行,盡管Activity、進程、App被殺死還是可以接收到廣播
-
動態注冊:跟隨Activity的生命周期
5、Broadcast Receiver實現機制
- 自定義廣播類繼承BroadcastReceiver,復寫onReceiver()
- 通過Binder機制向AMS進行注冊廣播
- 廣播發送者通過Binder機制向AMS發送廣播
- AMS查找符合相應條件的廣播發送到BroadcastReceiver相應的循環隊列中
- 消息隊列執行拿到廣播,回調BroadcastReceiver的onReceiver()
6、LocalBroadcastManager特點
- 本地廣播只能在自身App內傳播,不必擔心泄漏隱私數據
- 本地廣播不允許其他App對你的App發送該廣播,不必擔心安全漏洞被利用
- 本地廣播比全局廣播更高效
- 以上三點都是源于其內部是用Handler實現的
WebView面試題
1、WebView安全漏洞
API16之前存在遠程代碼執行安全漏洞,該漏洞源于程序沒有正確限制使用WebView.addJavascriptInterface方法,遠程攻擊者可通過使用Java反射機制利用該漏洞執行任意Java對象的方法
2、WebView銷毀步驟
WebView在其他容器上時(如:LinearLayout),當銷毀Activity時,需要在onDestroy()中先移除容器上的WebView,然后再將WebView.destroy(),這樣就不會導致內存泄漏
3、WebView的jsbridge
客戶端和服務端之間可以通過Javascript來互相調用各自的方法
4、WebViewClient的onPageFinished
WebViewClient的onPageFinished在每次完成頁面的時候調用,但是遇到未加載完成的頁面跳轉其他頁面時,就會一直調用,使用WebChromeClient.onProgressChanged可以替代
5、WebView后臺耗電
在WebView加載頁面的時候,會自動開啟線程去加載,如果不很好的關閉這些線程,就會導致電量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)結束當前正在運行中的java虛擬機
6、WebView硬件加速
Android3.0引入硬件加速,默認會開啟,WebView在硬件加速的情況下滑動更加平滑,性能更加好,但是會出現白塊或者頁面閃爍的副作用,建議WebView暫時關閉硬件加速
7、WebView內存泄漏
由于WebView是依附于Activity的,Activity的生命周期和WebView啟動的線程的生命周期是不一致的,這會導致WebView一直持有對這個Activity的引用而無法釋放,解決方案如下
-
獨立進程,簡單暴力,不過可能涉及到進程間通信(推薦)
-
動態添加WebView,對傳入WebView中使用的Context使用弱引用
Binder面試題
1、Linux內核的基本知識
-
進程隔離/虛擬地址空間:進程間是不可以共享數據的,相當于被隔離,每個進程被分配到不同的虛擬地址中
-
系統調用:Linux內核對應用有訪問權限,用戶只能在應用層通過系統調用,調用內核的某些程序
-
binder驅動:它負責各個用戶的進程,通過binder通信內核來進行交互的模塊
2、為什么使用Binder
- 性能上,相比傳統的Socket更加高效
- 安全性高,支持協議雙方互相校驗
3、Binder通信模型
-
Service服務端通過Binder驅動在ServiceManager的查找表中注冊Object對象的add方法
-
Client客戶端通過Binder驅動在ServiceManager的查找表中找到Object對象的add方法,并返回proxy的add方法,add方法是個空實現,proxy也不是真正的Object對象,是通過Binder驅動封裝好的代理類的add方法
-
當Client客戶端調用add方法時,Client客戶端通過Binder驅動將proxy的add方法,請求ServiceManager來找到Service服務端真正對象的add方法,進行調用
4、AIDL
-
客戶端通過aidl文件的Stub.asInterface()方法,拿到Proxy代理類
-
通過調用Proxy代理類的方法,將參數進行封包后,調用底層的transact()方法
-
transact()方法會回調onTransact()方法,進行參數的解封
-
在onTransact()方法中調用服務端對應的方法,并將結果返回
Handler面試題
1、Handler是什么
Handler通過發送和處理Message和Runnable對象來關聯相對應線程的MessageQueue
2、Handler使用方法
- post(runnable)
- sendMessage(message)
3、Handler工作原理
4、Handler引起的內存泄漏
原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放
解決:
- Handler內部持有外部Activity的弱引用
- Handler改為靜態內部類
- Handler.removeCallback()
AsyncTask面試題
1、AsyncTask是什么
它本質上就是一個封裝了線程池和Handler的異步框架
2、AsyncTask使用方法
三個參數
-
Params:表示后臺任務執行時的參數類型,該參數會傳給AysncTask的doInBackground()方法
-
Progress:表示后臺任務的執行進度的參數類型,該參數會作為onProgressUpdate()方法的參數
-
Result:表示后臺任務的返回結果的參數類型,該參數會作為onPostExecute()方法的參數
五個方法
-
onPreExecute():異步任務開啟之前回調,在主線程中執行
-
doInBackground():執行異步任務,在線程池中執行
-
onProgressUpdate():當doInBackground中調用publishProgress時回調,在主線程中執行
-
onPostExecute():在異步任務執行之后回調,在主線程中執行
-
onCancelled():在異步任務被取消時回調
3、AsyncTask工作原理
4、AsyncTask引起的內存泄漏
原因:非靜態內部類持有外部類的匿名引用,導致Activity無法釋放
解決:
- AsyncTask內部持有外部Activity的弱引用
- AsyncTask改為靜態內部類
- AsyncTask.cancel()
5、AsyncTask生命周期
在Activity銷毀之前,取消AsyncTask的運行,以此來保證程序的穩定
6、AsyncTask結果丟失
由于屏幕旋轉、Activity在內存緊張時被回收等情況下,Activity會被重新創建,此時,舊的AsyncTask持有舊的Activity引用,這個時候會導致AsyncTask的onPostExecute()對UI更新無效
7、AsyncTask并行or串行
-
AsyncTask在Android 2.3之前默認采用并行執行任務,AsyncTask在Android 2.3之后默認采用串行執行任務
-
如果需要在Android 2.3之后采用并行執行任務,可以調用AsyncTask的executeOnExecutor()
HandlerThread面試題
1、HandlerThread產生背景
當系統有多個耗時任務需要執行時,每個任務都會開啟一個新線程去執行耗時任務,這樣會導致系統多次創建和銷毀線程,從而影響性能。為了解決這一問題,Google提供了HandlerThread,HandlerThread是在線程中創建一個Looper循環器,讓Looper輪詢消息隊列,當有耗時任務進入隊列時,則不需要開啟新線程,在原有的線程中執行耗時任務即可,否則線程阻塞
2、HanlderThread的特點、
- HandlerThread本質上是一個線程,繼承自Thread
- HandlerThread有自己的Looper對象,可以進行Looper循環,可以創建Handler
- HandlerThread可以在Handler的handlerMessage中執行異步方法
- HandlerThread優點是異步不會堵塞,減少對性能的消耗
- HandlerThread缺點是不能同時繼續進行多任務處理,需要等待進行處理,處理效率較低
- HandlerThread與線程池不同,HandlerThread是一個串行隊列,背后只有一個線程。
IntentService面試題
1、IntentService是什么
IntentService是繼承自Service并處理異步請求的一個類,其內部采用HandlerThread和Handler實現的,在IntentService內有一個工作線程來處理耗時操作,其優先級比普通Service高。當任務完成后,IntentService會自動停止,而不需要手動調用stopSelf()。另外,可以多次啟動IntentService,每個耗時操作都會以工作隊列的方式在IntentService中onHandlerIntent()回調方法中執行,并且每次只會執行一個工作線程
2、IntentService使用方法
- 創建Service繼承自IntentService
- 覆寫構造方法和onHandlerIntent()方法
- 在onHandlerIntent()中執行耗時操作
小結
有了這么多優秀的開發工具,可以做出更高質量的Android應用。
當然了,“打鐵還需自身硬”,想要寫出優秀的代碼,最重要的一點還是自身的技術水平,不然用再好的工具也不能發揮出它的全部實力。
在這里我也分享一份大佬自己收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料這些都是我閑暇還會反復翻閱的精品資料。在腦圖中,每個知識點專題都配有相對應的實戰項目,可以有效的幫助大家掌握知識點。
總之也是在這里幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習
造方法和onHandlerIntent()方法
- 在onHandlerIntent()中執行耗時操作
小結
有了這么多優秀的開發工具,可以做出更高質量的Android應用。
當然了,“打鐵還需自身硬”,想要寫出優秀的代碼,最重要的一點還是自身的技術水平,不然用再好的工具也不能發揮出它的全部實力。
在這里我也分享一份大佬自己收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料這些都是我閑暇還會反復翻閱的精品資料。在腦圖中,每個知識點專題都配有相對應的實戰項目,可以有效的幫助大家掌握知識點。
總之也是在這里幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習
如果你有需要的話,可以點擊這里領取