Android面試常常吊死的問題
文章目錄
- Android面試常常吊死的問題
- 1、面試官:Context它是什麼,有什麼用?
- 2、面試官:什麼是Armv7?
- 3、面試官:爲什麼字節碼不能在Android中運行?
- 4、面試官:Gradle中的BuildType是什麼?你一般用它來幹什麼?
- 5、面試官:簡述一下Android的構建過程!
- 6、面試官:說一下Activity的生命週期!
- 7、面試官:既然提到了Activity生命週期,說一下 OnCreate() 和 OnStart() 的區別!
- 8、面試官:爲什麼要在Activity類的onCreate() 中執行setContentView()?
- 9、面試官:說一下Android的幾種啓動模式吧!他們分別是幹什麼的?
- 10、面試官:當旋轉屏幕時,Activity如何響應?
- 11、面試官:你是如何做到旋轉屏幕時防止數據重新加載和重置的?
- 12、面試官:說一下AsyncTasks和線程他們的區別!
- 13、面試官:AsyncTask和Activity的生命週期兩者有什麼關係?這會導致什麼問題?如何避免這些問題?
- 14、面試官:erializable和Parcelable之間有什麼區別?
- 15、面試官:什麼是(ANR)錯誤,如何防止它在應用程序中發生?
- 16、面試官:SharedPreferences中的commit() 和apply() 有什麼區別?
- 17、面試官:RecyclerView它是怎麼工作的?
- 18、面試官:再說一下RecyclerView與ListView有何不同?
- 19、面試官:MVC,MVP和MVVM有何區別?都有哪些優缺點?
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的構建過程!
應聘者:就是先編譯,然後進行打包這樣的過程!
面試官:確實夠簡單的!人才!我給你說下吧!
- 第一步:使用aapt(Android資產打包工具)工具編譯資源文件夾(/res)。它們被編譯成一個稱爲R.java的類文件。
- 第二步:通過javac將Java源代碼編譯爲.class文件,然後通過sdk“工具”中包含的“ dx”工具將類文件轉換爲Dalvik字節碼。輸出爲classes.dex。
- 第三步:編譯,android apkbuilder,它獲取所有輸入並構建apk(android打包密鑰)文件。
應聘者:學到了,學到了!…(可能在想,比我說的複雜,這不是簡述)
6、面試官:說一下Activity的生命週期!
應聘者:這個我知道,OnCreate(),OnStart(),OnResume(),OnPause(),OnStop(),OnDestroy(),OnRestart() 共7個!
面試官:這就完了?背下來這個有啥用?
面試官:我給你講講吧,你去別的公司面試你,你可以這樣回答,
- OnCreate():這是第一次創建視圖時。通常,這是我們創建視圖,從包中獲取數據等的地方。
- OnStart():在Activity對用戶可見時調用。如果Activity進入前臺,則緊跟着onResume();如果活動被隱藏,則緊跟着onStop()。
- OnResume():在Activity將開始與用戶互動時調用。此時,您的Activity位於Activity堆棧的頂部,而用戶輸入也進入了活Activity堆棧。
- OnPause():當Activity進入後臺但尚未被殺死時,被稱爲Activity生命週期的一部分。
- OnStop():不再對用戶可見時調用。
- OnDestroy():Activity結束時調用!
- 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的升級版!
面試官:我去,你這個回答我是第一次見!
-
ViewHolder模式: Recyclerview實現了ViewHolders模式,但在ListView中不是必需的。RecyclerView在滾動時回收並重用單元格。
-
LayoutManager:在ListView中,唯一可用的視圖類型是垂直ListView。RecyclerView將列表與其容器分離,因此可以通過設置LayoutManager在運行時輕鬆地將列表項放在不同的容器(linearLayout,gridLayout)中。
-
Recyclerview有着更多的動畫效果支持!
-
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 中由於需要展示內容而涉及的業務邏輯。
面試官:這是你回答過的最漂亮的一個了!