Android基礎面試常常吊死在這幾個問題上,1個、2個、3個、4個、5個、6個、7個、8個、9個、10個......

Android面試常常吊死的問題

在這裏插入圖片描述


1、面試官:Context它是什麼,有什麼用?

應聘者:這個是上下文!通過它可以訪問application的資源和相關的類!

面試官:什麼是Activity Context呢?爲什麼要用?

應聘者:此上下文在Activity中可用。該上下文與Activity的生命週期相關。在Activity範圍內傳遞上下文或需要其生命週期附加到當前上下文的上下文時,應使用Activity上下文。

面試官:那Application Context是什麼呢?有什麼用?

應聘者:我可以殺了你嗎!

面試官:先回去等通知吧!

Application Context它與應用程序的生命週期相關。當您需要一個生命週期與當前上下文分開的上下文時,或者在傳遞超出活動範圍的上下文時,可以使用Application Context。


2、面試官:什麼是Armv7?

應聘者:我怎麼知道?

面試官:我也不知道!我想讓你給我---------“講講”!

面試官心裏想:Android中有7種CPU架構。ARMv7是最常見的,因爲它針對電池消耗進行了優化。ARM64是該版本的改進過的,支持64位處理以實現更強大的計算。ARMx86在這三者中使用最少,因爲它對電池不友好。它比其他兩個功能強大。

備註:在Android 系統中,每一個CPU架構對應一個ABI:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64!


3、面試官:爲什麼字節碼不能在Android中運行?

應聘者:Android使用的是DVM(Dalvik虛擬機)而不是JVM(Java虛擬機)。

面試官:不錯,答上來了!


4、面試官:Gradle中的BuildType是什麼?你一般用它來幹什麼?

應聘者:不知道呀!能給我講一下嗎?

面試官:我講完你就回去等通知吧!BuildType定義了Gradle在構建和打包Android應用時使用的屬性。一般這樣可以用到,1、BuildType定義瞭如何構建模塊,例如是否運行ProGuard;2、構建中包含哪些資源可以用到BuildType;3、Gradle爲項目的產品風格和構建類型的每個可能組合創建一個構建變體。

應聘者:好的我知道了,我先回去等通知了!


5、面試官:簡述一下Android的構建過程!

應聘者:就是先編譯,然後進行打包這樣的過程!

面試官:確實夠簡單的!人才!我給你說下吧!

  1. 第一步:使用aapt(Android資產打包工具)工具編譯資源文件夾(/res)。它們被編譯成一個稱爲R.java的類文件。
  2. 第二步:通過javac將Java源代碼編譯爲.class文件,然後通過sdk“工具”中包含的“ dx”工具將類文件轉換爲Dalvik字節碼。輸出爲classes.dex。
  3. 第三步:編譯,android apkbuilder,它獲取所有輸入並構建apk(android打包密鑰)文件。

應聘者:學到了,學到了!…(可能在想,比我說的複雜,這不是簡述)


6、面試官:說一下Activity的生命週期!

應聘者:這個我知道,OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestroy(),OnRestart() 共7個!

面試官:這就完了?背下來這個有啥用?

面試官:我給你講講吧,你去別的公司面試你,你可以這樣回答,

  1. OnCreate():這是第一次創建視圖時。通常,這是我們創建視圖,從包中獲取數據等的地方。
  2. OnStart():在Activity對用戶可見時調用。如果Activity進入前臺,則緊跟着onResume();如果活動被隱藏,則緊跟着onStop()。
  3. OnResume():在Activity將開始與用戶互動時調用。此時,您的Activity位於Activity堆棧的頂部,而用戶輸入也進入了活Activity堆棧。
  4. OnPause():當Activity進入後臺但尚未被殺死時,被稱爲Activity生命週期的一部分。
  5. OnStop():不再對用戶可見時調用。
  6. OnDestroy():Activity結束時調用!
  7. OnRestart():在Activity停止之後,再次開始之前調用!

應聘者:…(當時應聘者的心理是這樣的,不知道怎麼說話)


7、面試官:既然提到了Activity生命週期,說一下 OnCreate() 和 OnStart() 的區別!

應聘者:emmmmmm!區別不大!

面試官:不大?在Activity生命週期中,無論是在應用程序啓動時,還是在Activity被銷燬然後重新創建(例如在配置更改期間)時,都會調用一次onCreate() 方法。只要Activity對用戶可見(通常在onCreate() 或onRestart() 之後),就會調用onStart() 方法。


8、面試官:爲什麼要在Activity類的onCreate() 中執行setContentView()?

應聘者:打開AndroidStudio就是生成在這裏,具體爲什麼要在這裏,我也不知道!

面試官:回答的真漂亮!由於Activity的 onCreate() 僅被調用一次,因此大多數初始化都應該在此進行。由於setContentView() 是一項繁重的操作,因此無法在onResume() 或onStart()(多次調用)中設置內容是無效的。


9、面試官:說一下Android的幾種啓動模式吧!他們分別是幹什麼的?

應聘者:一共有四種啓動模式Standard、SingleTop、SingleTask、SingleInstance。Standard是默認的,就是在不指定啓動模式的時候用到的是這個!其他的在指定的時候使用!

面試官:你糊弄我吶?

  • Standard:它在啓動Activity的任務中創建Activity的新實例。可以創建Activity的多個實例,並且可以將多個實例添加到相同或不同的任務。
    例如:假設有一個Activity堆棧A-> B->C。
    現在,如果我們以啓動模式爲“Standard”再次啓動B ,則新堆棧將爲A-> B-> C->B;

  • SingleTop:與標準Standard,除了堆棧頂部存在Activity的先前實例之外,它不會創建新實例,而是將意圖發送給Activity的現有實例。
    例如:假設有一個活動堆棧A->B。
    現在,如果我們以啓動模式爲“ singleTop”啓動C ,則新堆棧通常將是A-> B->C。
    再舉一個例子,如果有一個活動堆棧A-> B->C。如果我們以啓動模式爲“ singleTop”再次啓動C ,則新堆棧仍爲A-> B->C。

  • SingleTask:始終將創建一個新任務,並將新實例作爲根實例推送到該任務。因此,如果Activity已經在任務中,則該意圖將被重定向到onNewIntent( ) ,否則將創建一個新實例。一次只有一個Activity實例存在。
    例如:假設有一個活動堆棧A-> B-> C->D。
    現在,如果我們以啓動模式爲“ singleTask”啓動D ,新堆棧將爲A-> B-> C-> D !
    如果有一個活動堆棧A-> B-> C->D。
    如果我們以啓動模式爲“ singleTask”再次啓動活動B ,則新的活動堆棧將爲A->B。活動C和D將被摧毀。

  • SingleInstance:與單個任務相同,但是系統不會在與此Activity相同的任務中啓動任何Activity。如果啓動了新Activity,則它們是在單獨的任務中完成的。
    例如:假設有一個Activity堆棧A-> B-> C->D。如果我們以啓動模式爲“ singleInstance”再次啓動ActivityB ,則新的活動堆棧將爲:
    任務1 : A-> B-> C
    任務2 : D


10、面試官:當旋轉屏幕時,Activity如何響應?

應聘者:旋轉屏幕時,當前的Activity實例將被破壞,並以新的方向創建Activity的新實例。旋轉屏幕時,由於屏幕旋轉時會重新創建佈局,將首先調用onCreate() 方法。接下來照常按順序執行!


11、面試官:你是如何做到旋轉屏幕時防止數據重新加載和重置的?

應聘者:使用ViewModels和的組合onSaveInstanceState(),ViewModel具有LifeCycle-Aware的功能。換句話說,如果ViewModel的所有者因配置更改(例如,旋轉)而被銷燬,則不會銷燬它。所有者的新實例將重新連接到現有的ViewModel。因此,如果您將一個Activity旋轉3次,則您剛剛創建了三個不同的Activity實例,但是隻有一個ViewModel。通常的做法是將數據存儲在ViewModel類中(因爲它在配置更改期間保留數據),並使用OnSaveInstanceState存儲少量UI數據。

面試官:回答得不錯!


12、面試官:說一下AsyncTasks和線程他們的區別!

應聘者:應使用線程將長時間運行的操作與主線程分開,以提高性能。但是它不能被優雅地取消,並且不能處理Android的配置更改。無法從Thread更新UI。
AsyncTask可用於處理持續時間少於5毫秒的任務。使用AsyncTask,您可以更新與Java Thread不同的UI。但是,很多長時間運行的任務會降低性能。


13、面試官:AsyncTask和Activity的生命週期兩者有什麼關係?這會導致什麼問題?如何避免這些問題?

應聘者:我沒有遇到過問題!

面試官:回答得漂亮!我給你說下吧!

  • AsyncTask與包含它的Activity的生命週期無關。因此,例如,如果在Activity中啓動AsyncTask且用戶旋轉設備,則該Activity將被銷燬(並創建一個新的Activity實例),但AsyncTask不會死亡,而是繼續生存直到完成;

  • 當AsyncTask確實完成而不是更新新Activity的UI時,它更新了Activity的前一個實例(即創建它的實例,但不再顯示!)。這可能導致異常(類型爲java.lang.IllegalArgumentException:如果使用例如findViewById在Activity中檢索視圖,則視圖未附加到 Window manager);

  • 由於AsyncTask對Activity的引用,因此也有可能導致內存泄漏;

  • 由於這些原因,將AsyncTasks用於長時間運行的後臺任務通常不是一個很好的行爲。而是,對於長時間運行的後臺任務,應採用其他機制(例如服務);

備註:默認情況下,AsyncTasks使用串行執行程序在單個線程上運行,這意味着它只有一個線程,每個任務一個接一個地運行。


14、面試官:erializable和Parcelable之間有什麼區別?

應聘者:我沒有太深入瞭解…

  • 面試官:序列化是將對象轉換爲字節流以便將對象存儲到內存中的過程,以便可以在以後的時間重新創建它,同時仍保留對象的原始狀態和數據。

可以將變量聲明爲 transient 來禁止序列化。

可序列化是標準的Java接口。Parcelable是Android專用的界面,可以在其中自行實現序列化。它的創建要比Serializable的效率要高得多(此方法的問題是使用了反射,這是一個緩慢的過程。此機制還傾向於創建許多臨時對象,並導致相當多的垃圾回收。)


15、面試官:什麼是(ANR)錯誤,如何防止它在應用程序中發生?

應聘者:當UI停止響應超過5秒以上時,通常會因爲已阻塞主線程而出現ANR對話框。爲避免遇到ANR錯誤,應將盡可能多的任務移出主線程。

例如,當需要加載手機中很多圖片並要求拿到各種信息時,如照片的尺寸等,或讀取非常大的Json文件時候,應該放到子線程中操作,當處理完畢後,通知主線程繼續執行任務!

16、面試官:SharedPreferences中的commit() 和apply() 有什麼區別?

應聘者:都是數據寫入,一個是同步,一個是異步!

面試官:是的!

  • commit() 同步寫入數據,並根據結果立即返回成功或失敗的boolean類型值。
  • apply()是異步的,不會返回任何布爾響應。同樣,如果有一個apply() 未完成,將執行另一個commit() 。commit() 將被阻止,直到apply() 未完成。

17、面試官:RecyclerView它是怎麼工作的?

應聘者:他是一個列表,有自己的適配器,在onBindViewHolder方法中進行數據的綁定的!

面試官:我給你補充一下!RecyclerView在顯示較長的項目列表。假設我們要顯示100行項目。一種簡單的方法是隻創建100個視圖,每行一個視圖,然後將它們全部佈局。但這是浪費的,因爲在任何時間點上,只有10個左右的項目可以放在屏幕上,而其餘項目則不在屏幕上。因此,RecyclerView只創建屏幕上的10個左右的視圖。這樣,速度和內存使用率將提高10倍。但是,當開始滾動並需要開始顯示下一個視圖時會發生什麼?同樣,一種簡單的方法是爲需要顯示的每個新行創建一個新視圖。但是通過這種方式,當您到達列表的末尾時,將創建100個視圖,並且的內存使用情況將與第一種方法相同。創建視圖需要花費時間,因此您的滾動很可能不會很流暢。這就是爲什麼RecyclerView會利用以下事實:滾動時,新行出現在屏幕上,而舊行消失在屏幕上。代替爲每個新行創建新視圖,而是通過將新數據綁定到舊視圖來對其進行回收和重用!

應聘者:我學到了!


18、面試官:再說一下RecyclerView與ListView有何不同?

應聘者:RecyclerView是ListView的大哥,ListView的升級版!

面試官:我去,你這個回答我是第一次見!

  1. ViewHolder模式: Recyclerview實現了ViewHolders模式,但在ListView中不是必需的。RecyclerView在滾動時回收並重用單元格。

  2. LayoutManager:在ListView中,唯一可用的視圖類型是垂直ListView。RecyclerView將列表與其容器分離,因此可以通過設置LayoutManager在運行時輕鬆地將列表項放在不同的容器(linearLayout,gridLayout)中。

  3. Recyclerview有着更多的動畫效果支持!

  4. ViewHolder的模式:ViewHolder對象將每個組件視圖存儲在Layout的tag字段內,因此可以立即訪問它們而無需重複查找它們。在ListView中,findViewById()在滾動ListView期間,代碼可能會頻繁調用,這可能會降低性能。即使適配器返回膨脹視圖以進行回收,仍然需要查找元素並進行更新。重複使用的一種方法findViewById()是使用“ViewHolder”設計模式。


19、面試官:MVC,MVP和MVVM有何區別?都有哪些優缺點?

應聘者:這個我知道!

MVC是 Model-View-Controller 體系結構,其中模型是指數據模型類。該視圖引用xml文件,並且控制器處理業務邏輯。這種體系結構的問題是單元測試。該模型不受任何約束,因此可以輕鬆測試。控制器與android api緊密耦合,因此很難進行單元測試。由於視圖和控制器緊密耦合,因此模塊化和靈活性是一個問題。如果我們更改視圖,則控制器邏輯也應更改。維護也是一個問題。

MVP是Model-View-Presenter體系結構,該視圖包括xml和Activity/Fragment類。因此,該活動理想情況下將實現一個視圖界面,​​從而使單元測試更加容易(因爲這將在沒有視圖的情況下起作用)

MVVM是 Model-View-ViewModel 體系結構。它本質上就是MVC 的改進版。MVVM 就是將其中的View 的狀態和行爲抽象化,讓我們將視圖 UI 和業務邏輯分開。當然這些事 ViewModel 已經幫我們做了,它可以取出 Model 的數據同時幫忙處理 View 中由於需要展示內容而涉及的業務邏輯。

面試官:這是你回答過的最漂亮的一個了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章