面試三十三題!說實話,中高階面試題看完解析後也不怎麼難!

yilian發表於2020-01-20

說起我們們程式設計師,那可是有三個等級,分別是初、中、高。

而大部分人,都蹲在初級這裡和每年進入人才市場的畢業生一起感慨:市場飽和就業難。

初級程式設計師是飽和了,但是高階程式設計師呢?簡直是稀缺。如果一直停留在初級程式設計師的水平,什麼高薪程式設計師一月收入20k,那只有蓋上被子在夢裡實現了。

而中高階,並沒有想象中的那麼難,這裡有三十三道Android中高階面試題,看完解析之後,你會發現不是我學不會,而是我沒有去學


timg (4).jpg
timg (4).jpg

題目加解析

1、Activity生命週期?

onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

2、Service生命週期?

service 啟動方式有兩種
一種是透過 startService()方式進行啟動
另一種是透過 bindService()方式進行啟動。
不同的啟動方式他們的生命週期是不一樣.

透過 startService()這種方式啟動的 service
生命週期是這樣:
呼叫 startService() --> onCreate()--> onStartConmon()--> onDestroy()
這種方式啟動的話,需要注意一下幾個問題
第一:當我們透過 startService被呼叫以後,多次在呼叫 startService(),onCreate()方法也只會被呼叫一次,而 onStartConmon()會被多次呼叫,當我們呼叫 stopService()的時候, onDestroy()就會被呼叫,從而銷燬服務。
第二:當我們透過 startService啟動時候,透過intent傳值,在 onStartConmon()方法中獲取值的時候,一定要先判斷 intent是否為 null

透過 bindService()方式進行繫結,這種方式繫結 service
生命週期:
bindService-->onCreate()-->onBind()-->unBind()-->onDestroy()
bindservice這種方式進行啟動 service好處是更加便利 activity中操作 service,如果要在 activity中呼叫,在需要在 activity獲取 ServiceConnection物件,透過 ServiceConnection來獲取 service中內部類的類物件,然後透過這個類物件就可以呼叫類中的方法,當然這個類需要繼承Binder物件

3、Activity的啟動過程(不要回答生命週期)

4、Broadcast註冊方式與區別

此處延伸:什麼情況下用動態註冊

Broadcast廣播,註冊方式主要有兩種.
第一種是靜態註冊,也可成為常駐型廣播,這種廣播需要在 Androidmanifest.xml中進行註冊,這中方式註冊的廣播,不受頁面生命週期的影響,即使退出了頁面,也可以收到廣播這種廣播一般用於想開機自啟動啊等等,由於這種註冊的方式的廣播是常駐型廣播,所以會佔用CPU的資源。

第二種是動態註冊,而動態註冊的話,是在程式碼中註冊的,這種註冊方式也叫非常駐型廣播,受到生命週期的影響,退出頁面後,就不會收到廣播,我們通常運用在更新UI方面。這種註冊方式優先順序較高。最後需要解綁,否會會記憶體洩露

廣播是分為有序廣播和無序廣播。

5、HttpClient與HttpUrlConnection的區別

此處延伸: Volley裡用的哪種請求方式

首先 HttpClientHttpUrlConnection這兩種方式都支援Https協議,都是以流的形式進行上傳或者下載資料,也可以說是以流的形式進行資料的傳輸,還有 ipv6,以及連線池等功能。 HttpClient這個擁有非常多的API,所以如果想要進行擴充套件的話,並且不破壞它的相容性的話,很難進行擴充套件,也就是這個原因, GoogleAndroid6.0的時候,直接就棄用了這個 HttpClient.

HttpUrlConnection相對來說就是比較輕量級了,API比較少,容易擴充套件,並且能夠滿足 Android大部分的資料傳輸。比較經典的一個框架 volley,在 Android 2.3版本以前都是使用 Android HttpClient,在 Android 2.3以後就使用了 HttpUrlConnection

6、java虛擬機器和Dalvik虛擬機器的區別

Java虛擬機器:
1、 java虛擬機器基於棧。
基於棧的機器必須使用指令來載入和操作棧上資料,所需指令更多更多。
2、 java虛擬機器執行的是 java位元組碼。
java類會被編譯成一個或多個位元組碼 .class檔案.

Dalvik虛擬機器:
1、 dalvik虛擬機器是基於暫存器的
2、 Dalvik執行的是自定義的 .dex位元組碼格式。
java類被編譯成 .class檔案後,會透過一個 dx工具將所有的.class檔案轉換成一個 .dex檔案,然後 dalvik虛擬機器會從其中讀取指令和資料.
3、常量池已被修改為只使用 32位的索引,以 簡化直譯器。
4、一個應用,一個虛擬機器例項,一個程式
所有 android應用的執行緒都是對應一個 linux執行緒,都執行在自己的沙盒中,不同的應用在不同的程式中執行。每個 android dalvik應用程式都被賦予了一個獨立的 linux PID(app_*)

7、程式保活(不死程式)

8、講解一下Context

9、理解Activity,View,Window三者關係

10、四種LaunchMode及其使用場景

11、View的繪製流程

12、View,ViewGroup事件分發

13、儲存Activity狀態

onSaveInstanceState(Bundle)會在 activity轉入後臺狀態之前被呼叫,也就是 onStop()方法之前, onPause方法之後被呼叫;

14、Android中的幾種動畫

幀動畫:
指透過指定每一幀的圖片和播放時間,有序的進行播放而形成動畫效果,比如想聽的律動條。

補間動畫:
指透過指定 View的初始狀態、變化時間、方式,透過一系列的演算法去進行圖形變換,從而形成動畫效果,主要有 AlphaScaleTranslateRotate四種效果。
注意:只是在檢視層實現了動畫效果,並沒有真正改變 View的屬性,比如滑動列表,改變標題欄的透明度。

屬性動畫:
Android3.0的時候才支援,透過不斷的改變 View的屬性,不斷的重繪而形成動畫效果。相比於檢視動畫, View的屬性是真正改變了。比如 view的旋轉,放大,縮小。

15、Android中跨程式通訊的幾種方式

Android跨程式通訊,像 intentcontentProvider,廣播, service都可以跨程式通訊。

intent:
這種跨程式方式並不是訪問記憶體的形式,它需要傳遞一個 uri,比如說打電話。

contentProvider:
這種形式,是使用資料共享的形式進行資料共享。

service:
遠端服務,比如 aidl

廣播:
廣播 包含靜態廣播,動態廣播。

16、AIDL理解

17、Handler的原理

Android中主執行緒是不能進行耗時操作的,子執行緒是不能進行更新 UI的。所以就有了 handler,它的作用就是實現執行緒之間的通訊。

handler整個流程中,主要有四個物件,
handlerMessage, MessageQueue, Looper。當應用建立的時候,就會在主執行緒中建立 handler物件,

我們透過要傳送的訊息儲存到 Message中, handler透過呼叫 sendMessage方法將 Message傳送到 MessageQueue中, Looper物件就會不斷的呼叫loop()方法

不斷的從 MessageQueue中取出 Message交給 handler進行處理。從而實現執行緒之間的通訊。

18、Binder機制原理

Android系統的 Binder機制中,是有 Client, Service, ServiceManager, Binder驅動程式組成的,其中 ClientserviceService Manager執行在使用者空間, Binder驅動程式是執行在核心空間的。而 Binder就是把這4種元件粘合在一塊的粘合劑,其中核心的元件就是 Binder驅動程式, Service Manager提供輔助管理的功能,而 ClientService正是在 Binder驅動程式和 Service Manager提供的基礎設施上實現 C/S之間的通訊。其中 Binder驅動程式提供裝置檔案 /dev/binder與使用者控制元件進行互動, ClientServiceService Manager透過 openioctl檔案操作相應的方法與 Binder驅動程式進行通訊。而 ClientService之間的程式間通訊是透過 Binder驅動程式間接實現的。而 Binder Manager是一個守護程式,用來管理 Service,並向 Client提供查詢 Service介面的能力。

19、熱修復的原理

我們知道  Java虛擬機器 ——  JVM是載入類的 class檔案的,而 Android虛擬機器—— Dalvik/ART VM是載入類的 dex檔案,而他們載入類的時候都需要 ClassLoader, ClassLoader有一個子 BaseDexClassLoader,而 BaseDexClassLoader下有一個陣列—— DexPathList,是用來存放 dex檔案,當 BaseDexClassLoader透過呼叫 findClass方法時,實際上就是遍歷陣列,找到相應的 dex檔案,找到,則直接將它 return。而熱修復的解決方法就是將新的 dex新增到該集合中,並且是在舊的 dex的前面,所以就會優先被取出來並且 return返回。
`

20、Android記憶體洩露及管理

22、Android UI適配

字型使用 sp,
dp,多使用 match_parent,wrap_content,weight
圖片資源,不同圖片的的解析度,放在相應的資料夾下可使用百分比代替。

23、app最佳化

21、Fragment與Fragment、Activity通訊的方式

24、圖片最佳化

(1)對圖片本身進行操作。
儘量不要使用 setImageBitmapsetImageResourceBitmapFactory.decodeResource來設定一張大圖,因為這些方法在完成 decode後,最終都是透過  java 層的  createBitmap來完成的,需要消耗更多記憶體.
(2)圖片進行縮放的比例, SDK中建議其值是 2的指數值,值越大會導致圖片不清晰。
(3)不用的圖片記得呼叫圖片的 recycle()方法

25、HybridApp WebView和JS互動

26、JAVA GC原理

垃圾收集演算法的核心思想是:
對虛擬機器可用記憶體空間,即堆空間中的物件進行識別,如果物件正在被引用,那麼稱其為存活物件,反之,如果物件不再被引用,則為垃圾物件,可以回收其佔據的空間,用於再分配。垃圾收集演算法的選擇和垃圾收集系統引數的合理調節直接影響著系統效能。

27、ANR

ANR全名 Application Not Responding, 也就是"應用無響應". 當操作在一段時間內系統無法處理時, 系統層面會彈出上圖那樣的 ANR對話方塊.

產生原因:
(1) 5s內無法響應使用者輸入事件(例如鍵盤輸入, 觸控螢幕等).
(2) BroadcastReceiver在10s內無法結束
(3) Service 20s內無法結束(低機率)

解決方式:
(1)不要在主執行緒中做耗時的操作,而應放在子執行緒中來實現。如 onCreate()和onResume()裡儘可能少的去做建立操作。
(2)應用程式應該避免在 BroadcastReceiver裡做耗時的操作或計算。
(3)避免在 Intent Receiver裡啟動一個 Activity,因為它會建立一個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。
(4) service是執行在主執行緒的,所以在 service中做耗時操作,必須要放在子執行緒中。

28、設計模式

29、Xutils, OKhttp, Volley, Retrofit對比

30、MVP,MVC,MVVM

31、JNI

(1)安裝和下載 Cygwin,下載  Android NDK
(2)在 ndk專案中 JNI介面的設計
(3)使用 C/C++實現本地方法
(4) JNI生成動態連結庫 .so檔案
(5)將動態連結庫複製到 java工程,在 java工程中呼叫,執行 java工程即可

32、RecyclerView和ListView的區別

RecyclerView可以完成 ListView, GridView的效果,還可以完成瀑布流的效果。同時還可以設定列表的滾動方向(垂直或者水平);
RecyclerViewview的複用不需要開發者自己寫程式碼,系統已經幫封裝完成了。
RecyclerView可以進行區域性重新整理。
RecyclerView提供了 API來實現 item的動畫效果。

在效能上:
如果需要頻繁的重新整理資料,需要新增動畫,則 RecyclerView有較大的優勢。
如果只是作為列表展示,則兩者區別並不是很大。

33、Universal-ImageLoader,Picasso,Fresco,Glide對比

最後

篇幅有限,解釋起來太長了,就看這裡好的文件吧
連結:
提取碼:mk53

還可以來我的GitHub交友地址: ,點下star一起來學習唄


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2674114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章