Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

掌握這十個搜索技巧讓你的工作效率至上提高十倍,值得推薦

mb612ed909765ec 2021-09-26 04:28:42 阅读数:61 评论数:0 点赞数:0 收藏数:0

一.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()? bingservice 這種方式進行啟動service好處是更加便利activity中操作service,比如加入service中有幾個方法,a,b ,如果要在activity中調用,在需要在activity獲取ServiceConnection對象,通過ServiceConnection來獲取service中內部類的類對象,然後通過這個類對象就可以調用類中的方法,當然這個類需要繼承Binder對象

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

app啟動的過程有兩種情况,第一種是從桌面launcher上點擊相應的應用圖標,第二種是在activity中通過調用startActivity來啟動一個新的activity。

我們創建一個新的項目,默認的根activity都是MainActivity,而所有的activity都是保存在堆棧中的,我們啟動一個新的activity就會放在上一個activity上面,而我們從桌面點擊應用圖標的時候,由於launcher本身也是一個應用,當我們點擊圖標的時候,系統就會調用startActivitySately(),一般情况下,我們所啟動的activity的相關信息都會保存在intent中,比如action,category等等。我們在安裝這個應用的時候,系統也會啟動一個PackaManagerService的管理服務,這個管理服務會對AndroidManifest.xml文件進行解析,從而得到應用程序中的相關信息,比如service,activity,Broadcast等等,然後獲得相關組件的信息。

當我們點擊應用圖標的時候,就會調用startActivitySately()方法,而這個方法內部則是調用startActivty(),而startActivity()方法最終還是會調用startActivityForResult()這個方法。而在startActivityForResult()這個方法。因為startActivityForResult()方法是有返回結果的,所以系統就直接給一個-1,就錶示不需要結果返回了。

startActivityForResult()這個方法實際是通過Instrumentation類中的execStartActivity()方法來啟動activity,Instrumentation這個類主要作用就是監控程序和系統之間的交互。而在這個execStartActivity()方法中會獲取ActivityManagerService的代理對象,通過這個代理對象進行啟動activity。啟動會就會調用一個checkStartActivityResult()方法,如果說沒有在配置清單中配置有這個組件,就會在這個方法中拋出异常了。當然最後是調用的是Application.scheduleLaunchActivity()進行啟動activity,而這個方法中通過獲取得到一個ActivityClientRecord對象,而這個ActivityClientRecord通過handler來進行消息的發送,系統內部會將每一個activity組件使用ActivityClientRecord對象來進行描述,而ActivityClientRecord對象中保存有一個LoaderApk對象,通過這個對象調用handleLaunchActivity來啟動activity組件,而頁面的生命周期方法也就是在這個方法中進行調用。

4、Broadcast注册方式與區別?

5、HttpClient與HttpUrlConnection的區別?

此處延伸:Volley裏用的哪種請求方式(2.3前HttpClient,2.3後HttpUrlConnection

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

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

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

Java虛擬機:

  • java虛擬機基於棧。?基於棧的機器必須使用指令來載入和操作棧上數據,所需指令更多更多。
  • java虛擬機運行的是java字節碼。(java類會被編譯成一個或多個字節碼.class文件)

Dalvik虛擬機:

  • dalvik虛擬機是基於寄存器的
  • Dalvik運行的是自定義的.dex字節碼格式。(java類被編譯成.class文件後,會通過一個dx工具將所有的.class文件轉換成一個.dex文件,然後dalvik虛擬機會從其中讀取指令和數據
  • 常量池已被修改為只使用32比特的索引,以 簡化解釋器。
  • 一個應用,一個虛擬機實例,一個進程(所有android應用的線程都是對應一個linux線程,都運行在自己的沙盒中,不同的應用在不同的進程中運行。每個android dalvik應用程序都被賦予了一個獨立的linux PID(app_*))

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

此處延伸:進程的優先級是什麼

8、講解一下Context?

Context是一個抽象基類。在翻譯為上下文,也可以理解為環境,是提供一些程序的運行環境基礎信息。Context下有兩個子類,ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實現類。

ContextWrapper又有三個直接的子類, ContextThemeWrapperServiceApplication。其中,ContextThemeWrapper是一個帶主題的封裝類,而它有一個直接子類就是Activity,所以Activity和Service以及Application的Context是不一樣的,只有Activity需要主題,Service不需要主題。Context一共有三種類型,分別是Application、Activity和Service。這三個類雖然分別各種承擔著不同的作用,但它們都屬於Context的一種,而它們具體Context的功能則是由ContextImpl類去實現的,因此在絕大多數場景下,Activity、Service和Application這三種類型的Context都是可以通用的。不過有幾種場景比較特殊,比如啟動Activity,還有彈出Dialog。

出於安全原因的考慮,Android是不允許Activity或Dialog憑空出現的,一個Activity的啟動必須要建立在另一個Activity的基礎之上,也就是以此形成的返回棧。而Dialog則必須在一個Activity上面彈出(除非是System Alert類型的Dialog),因此在這種場景下,我們只能使用Activity類型的Context,否則將會出錯。

getApplicationContext()getApplication()方法得到的對象都是同一個application對象,只是對象的類型不一樣。

Context數量 = Activity數量 + Service數量 + 1 (1為Application)

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

這個問題真的很不好回答。所以這裏先來個算是比較恰當的比喻來形容下它們的關系吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。

1 Activity構造的時候會初始化一個Window,准確的說是PhoneWindow
2 這個PhoneWindow有一個“ViewRoot”,這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。
3ViewRoot”通過addView方法來一個個的添加View。比如TextViewButton
4 這些View的事件監聽,是由WindowManagerService來接受消息,並且回調Activity函數。比如onClickListeneronKeyDown等。

10、四種LaunchMode及其使用場景

此處延伸:棧(First In Last Out)與隊列(First In First Out)的區別

棧與隊列的區別:

1.?隊列先進先出,棧先進後出
2.?對插入和删除操作的"限定"。 棧是限定只能在錶的一端進行插入和删除操作的線性錶。 隊列是限定只能在錶的一端進行插入和在另一端進行删除操作的線性錶。
3.?遍曆數據速度不同

standard 模式

這是默認模式,每次激活Activity時都會創建Activity實例,並放入任務棧中。使用場景:大多數Activity。

singleTop 模式

如果在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),否則就會創建新的實例並放入棧頂,即使棧中已經存在該Activity的實例,只要不在棧頂,都會創建新的實例。使用場景如新聞類或者閱讀類App的內容頁面。

singleTask 模式

如果在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,因此在它上面的實例將會被移出棧。如果棧中不存在該實例,將會創建新的實例放入棧中。使用場景如瀏覽器的主界面。不管從多少個應用啟動瀏覽器,只會啟動主界面一次,其餘情况都會走onNewIntent,並且會清空主界面上面的其他頁面。

singleInstance 模式

在一個新棧中創建該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果相當於多個應用共享一個應用,不管誰激活該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用於中間頁面,如果用於中間頁面,跳轉會有問題,比如:A -> B (singleInstance) -> C,完全退出後,在此啟動,首先打開的是B。

11、View的繪制流程

12、View,ViewGroup事件分發

13、保存Activity狀態

14、Android中的幾種動畫

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

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

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

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

16、AIDL理解

此處延伸:簡述Binder

?AIDL: 每一個進程都有自己的Dalvik VM實例,都有自己的一塊獨立的內存,都在自己的內存上存儲自己的數據,執行著自己的操作,都在自己的那片狹小的空間裏過完自己的一生。而aidl就類似與兩個進程之間的橋梁,使得兩個進程之間可以進行數據的傳輸,跨進程通信有多種選擇,比如 BroadcastReceiver , Messenger 等,但是 BroadcastReceiver 占用的系統資源比較多,如果是頻繁的跨進程通信的話顯然是不可取的;Messenger 進行跨進程通信時請求隊列是同步進行的,無法並發執行。

Binde機制簡單理解:

在Android系統的Binder機制中,是有Client,Service,ServiceManager,Binder驅動程序組成的,其中ClientserviceService Manager運行在用戶空間,Binder驅動程序是運行在內核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅動程序,Service Manager提供輔助管理的功能,而Client和Service正是在Binder驅動程序和Service Manager提供的基礎設施上實現C/S 之間的通信。其中Binder驅動程序提供設備文件/dev/binder與用戶控件進行交互,

ClientServiceService Manager通過open和ioctl文件操作相應的方法與Binder驅動程序進行通信。而Client和Service之間的進程間通信是通過Binder驅動程序間接實現的。而Binder Manager是一個守護進程,用來管理Service,並向Client提供查詢Service接口的能力。

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通過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內存泄露及管理

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

22、Android UI適配

23、app優化

24、圖片優化

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

25、HybridApp WebView和JS交互

26、JAVA GC原理

27、ANR

28、設計模式

29、RxJava

30、MVP,MVC,MVVM

此處延伸:手寫mvp例子,與mvc之間的區別,mvp的優勢

MVP模式,對應著Model–業務邏輯和實體模型,view–對應著activity,負責View的繪制以及與用戶交互,Presenter–負責View和Model之間的交互,MVP模式是在MVC模式的基礎上,將Model與View徹底分離使得項目的耦合性更低,在Mvc中項目中的activity對應著mvc中的C--Controllor,而項目中的邏輯處理都是在這個C中處理,同時View與Model之間的交互,也是也就是說,mvc中所有的邏輯交互和用戶交互,都是放在Controllor中,也就是activity中。

View和model是可以直接通信的。而MVP模式則是分離的更加徹底,分工更加明確Model–業務邏輯和實體模型,view–負責與用戶交互,Presenter 負責完成View於Model間的交互,MVP和MVC最大的區別是MVC中是允許Model和View進行交互的,而MVP中很明顯,Model與View之間的交互由Presenter完成。還有一點就是PresenterView之間的交互是通過接口的

31、手寫算法(選擇冒泡必須要會)

32、JNI?

(1) 安裝和下載Cygwin,下載 Android NDK
(2) 在ndk項目中JNI接口的設計
(3) 使用C/C++實現本地方法
(4) JNI生成動態鏈接庫.so文件
(5) 將動態鏈接庫複制到java工程,在java工程中調用,運行java工程即可

33、RecyclerView和ListView的區別

RecyclerView可以完成ListView,GridView的效果,還可以完成瀑布流的效果。同時還可以設置列錶的滾動方向(垂直或者水平);

RecyclerView中view的複用不需要開發者自己寫代碼,系統已經幫封裝完成了
RecyclerView可以進行局部刷新。

RecyclerView提供了API來實現item的動畫效果。

在性能上:

如果需要頻繁的刷新數據,需要添加動畫,則RecyclerView有較大的優勢。

如果只是作為列錶展示,則兩者區別並不是很大。

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

35、Xutils, OKhttp, Volley, Retrofit對比

最後我還整理了很多Android中高級的PDF技術文檔。以及一些大廠面試真題解析文檔。

 開源分享:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》

掌握這十個搜索技巧讓你的工作效率至上提高十倍,值得推薦_Android

Android高級架構師之路很漫長,一起共勉吧!

版权声明
本文为[mb612ed909765ec]所创,转载请带上原文链接,感谢

编程之旅,人生之路,不止于编程,还有诗和远方。
阅代码原理,看框架知识,学企业实践;
赏诗词,读日记,踏人生之路,观世界之行;

支付宝红包,每日可领