文章目錄:
- Activity面試題
- Fragment面試題
- Service面試題
- Broadcast Receiver面試題
- WebView面試題
- Binder面試題
一、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()方法中呼叫服務端對應的方法,並將結果返回