面試三十三題!說實話,中高階面試題看完解析後也不怎麼難!
說起我們們程式設計師,那可是有三個等級,分別是初、中、高。
而大部分人,都蹲在初級這裡和每年進入人才市場的畢業生一起感慨:市場飽和就業難。
初級程式設計師是飽和了,但是高階程式設計師呢?簡直是稀缺。如果一直停留在初級程式設計師的水平,什麼高薪程式設計師一月收入20k,那只有蓋上被子在夢裡實現了。
而中高階,並沒有想象中的那麼難,這裡有三十三道Android中高階面試題,看完解析之後,你會發現不是我學不會,而是我沒有去學
題目加解析
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
裡用的哪種請求方式
首先
HttpClient
和
HttpUrlConnection
這兩種方式都支援Https協議,都是以流的形式進行上傳或者下載資料,也可以說是以流的形式進行資料的傳輸,還有
ipv6
,以及連線池等功能。
HttpClient
這個擁有非常多的API,所以如果想要進行擴充套件的話,並且不破壞它的相容性的話,很難進行擴充套件,也就是這個原因,
Google
在
Android6.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
的初始狀態、變化時間、方式,透過一系列的演算法去進行圖形變換,從而形成動畫效果,主要有
Alpha
、
Scale
、
Translate
、
Rotate
四種效果。
注意:只是在檢視層實現了動畫效果,並沒有真正改變
View
的屬性,比如滑動列表,改變標題欄的透明度。
屬性動畫:
在
Android3.0
的時候才支援,透過不斷的改變
View
的屬性,不斷的重繪而形成動畫效果。相比於檢視動畫,
View
的屬性是真正改變了。比如
view
的旋轉,放大,縮小。
15、Android中跨程式通訊的幾種方式
Android
跨程式通訊,像
intent
,
contentProvider
,廣播,
service
都可以跨程式通訊。
intent:
這種跨程式方式並不是訪問記憶體的形式,它需要傳遞一個
uri
,比如說打電話。
contentProvider:
這種形式,是使用資料共享的形式進行資料共享。
service:
遠端服務,比如
aidl
廣播:
廣播 包含靜態廣播,動態廣播。
16、AIDL理解
17、Handler的原理
Android
中主執行緒是不能進行耗時操作的,子執行緒是不能進行更新
UI
的。所以就有了
handler
,它的作用就是實現執行緒之間的通訊。
handler整個流程中,主要有四個物件,
handler
,
Message
,
MessageQueue
,
Looper
。當應用建立的時候,就會在主執行緒中建立
handler
物件,
我們透過要傳送的訊息儲存到
Message
中,
handler
透過呼叫
sendMessage
方法將
Message
傳送到
MessageQueue
中,
Looper
物件就會不斷的呼叫loop()方法
不斷的從
MessageQueue
中取出
Message
交給
handler
進行處理。從而實現執行緒之間的通訊。
18、Binder機制原理
在
Android
系統的
Binder
機制中,是有
Client
,
Service
,
ServiceManager
,
Binder
驅動程式組成的,其中
Client
,
service
,
Service Manager
執行在使用者空間,
Binder
驅動程式是執行在核心空間的。而
Binder
就是把這4種元件粘合在一塊的粘合劑,其中核心的元件就是
Binder
驅動程式,
Service Manager
提供輔助管理的功能,而
Client
和
Service
正是在
Binder
驅動程式和
Service Manager
提供的基礎設施上實現
C/S
之間的通訊。其中
Binder
驅動程式提供裝置檔案
/dev/binder
與使用者控制元件進行互動,
Client
、
Service
,
Service Manager
透過
open
和
ioctl
檔案操作相應的方法與
Binder
驅動程式進行通訊。而
Client
和
Service
之間的程式間通訊是透過
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)對圖片本身進行操作。
儘量不要使用
setImageBitmap
、
setImageResource
、
BitmapFactory.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
的效果,還可以完成瀑布流的效果。同時還可以設定列表的滾動方向(垂直或者水平);
RecyclerView
中
view
的複用不需要開發者自己寫程式碼,系統已經幫封裝完成了。
RecyclerView
可以進行區域性重新整理。
RecyclerView
提供了
API
來實現
item
的動畫效果。
在效能上:
如果需要頻繁的重新整理資料,需要新增動畫,則
RecyclerView
有較大的優勢。
如果只是作為列表展示,則兩者區別並不是很大。
33、Universal-ImageLoader,Picasso,Fresco,Glide對比
最後
篇幅有限,解釋起來太長了,就看這裡好的文件吧
連結:
提取碼:mk53
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2674114/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中高階面試題Java面試題
- 中高階Java面試題Java面試題
- 2018 Android中高階面試題總結Android面試題
- 2020面試必知:中高階工程師面試題集整理(題目+答案)工程師面試題
- Java面試題中高階進階(JVM篇01)Java面試題JVM
- Android面試總結,有了這些中高階面試專題-大廠還會遠嗎?Android面試題及解析Android面試題
- 中高階前端開發高頻面試題前端面試題
- Java面試題中高階進階(JVM調優篇)Java面試題JVM
- 最難的 JavaScript 面試題解析JavaScript面試題
- Java面試題中高階進階(JVM篇Java垃圾回收)Java面試題JVM
- Java面試題中高階進階(JVM篇Java記憶體)Java面試題JVM記憶體
- [面試題]事件迴圈經典面試題解析面試題事件
- 2018年Android面試題含答案--適合中高階(下)Android面試題
- 史上最全的中高階JAVA工程師-面試題彙總Java工程師面試題
- Java面試題解析Java面試題
- Android面試準備(中高階)Android面試
- 面試疑難問題面試
- 2018中高階Android面試題總結上(附答案)Android面試題
- 2019年總結:Java中高階面試題228道系列(6)Java面試題
- 面試前不陪女朋友也要看完這套spring原始碼面試題(附答案)Spring原始碼面試題
- 20道python面試題,看完不用愁!Python面試題
- 今日頭條實習面試題解析面試題
- 想去Google做AI?先看完這套面試指南(附面試題)GoAI面試題
- Java中高階面試題及答案【第三部分】Java面試題
- 75 道 BAJT 中高階 Java 面試題,你能答上幾道?Java面試題
- HTML最新面試題(筆試面試題)HTML面試題筆試
- 2019 阿里java面試總結 (含面試題解析)阿里Java面試題
- 面試題:面試經面試題
- Android 中高階面試必知必會Android面試
- Android面試題——進階篇Android面試題
- js面試題(進階)梳理JS面試題
- 看了這篇Dubbo RPC面試題,讓天下沒有難面的面試題!RPC面試題
- 常見面試題 - URL 解析面試題
- Google經典面試題解析Go面試題
- 50道Linux面試題,答上一半面試不成功也難!Linux面試題
- AI筆試面試題庫-Python題目解析1AI筆試面試題Python
- AI筆試面試題庫-Python題目解析3AI筆試面試題Python
- AI筆試面試題庫-Python題目解析4AI筆試面試題Python