文章目錄:

  • 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()方法中調用服務端對應的方法,並將結果返回

希望我的分享能夠幫助到你,希望看到這里的朋友都能夠前程似錦,拿到自己心儀的offer!我整理了一些Java、Android的面試資料,需要的朋友可以加群:979045005,找群管理領取資料。