溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

android中高級(jí)面試題有哪些

發(fā)布時(shí)間:2022-01-12 11:04:41 來(lái)源:億速云 閱讀:113 作者:iii 欄目:移動(dòng)開(kāi)發(fā)

今天小編給大家分享一下android中高級(jí)面試題有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。

1、Activity生命周期?

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

2、Service生命周期?

service 啟動(dòng)方式有兩種
一種是通過(guò)startService()方式進(jìn)行啟動(dòng)
另一種是通過(guò)bindService()方式進(jìn)行啟動(dòng)。
不同的啟動(dòng)方式他們的生命周期是不一樣.

通過(guò)startService()這種方式啟動(dòng)的service
生命周期是這樣:
調(diào)用startService() --> onCreate()--> onStartConmon()--> onDestroy()。
這種方式啟動(dòng)的話,需要注意一下幾個(gè)問(wèn)題
第一:當(dāng)我們通過(guò)startService被調(diào)用以后,多次在調(diào)用startService(),onCreate()方法也只會(huì)被調(diào)用一次,而onStartConmon()會(huì)被多次調(diào)用,當(dāng)我們調(diào)用stopService()的時(shí)候,onDestroy()就會(huì)被調(diào)用,從而銷毀服務(wù)。
第二:當(dāng)我們通過(guò)startService啟動(dòng)時(shí)候,通過(guò)intent傳值,在onStartConmon()方法中獲取值的時(shí)候,一定要先判斷intent是否為null

通過(guò)bindService()方式進(jìn)行綁定,這種方式綁定service
生命周期:
bindService-->onCreate()-->onBind()-->unBind()-->onDestroy()
bindservice這種方式進(jìn)行啟動(dòng)service好處是更加便利activity中操作service,如果要在activity中調(diào)用,在需要在activity獲取ServiceConnection對(duì)象,通過(guò)ServiceConnection來(lái)獲取service中內(nèi)部類的類對(duì)象,然后通過(guò)這個(gè)類對(duì)象就可以調(diào)用類中的方法,當(dāng)然這個(gè)類需要繼承Binder對(duì)象

3、Activity的啟動(dòng)過(guò)程(不要回答生命周期)
4、Broadcast注冊(cè)方式與區(qū)別

此處延伸:什么情況下用動(dòng)態(tài)注冊(cè)

Broadcast廣播,注冊(cè)方式主要有兩種.
第一種是靜態(tài)注冊(cè),也可成為常駐型廣播,這種廣播需要在Androidmanifest.xml中進(jìn)行注冊(cè),這中方式注冊(cè)的廣播,不受頁(yè)面生命周期的影響,即使退出了頁(yè)面,也可以收到廣播這種廣播一般用于想開(kāi)機(jī)自啟動(dòng)啊等等,由于這種注冊(cè)的方式的廣播是常駐型廣播,所以會(huì)占用CPU的資源。

第二種是動(dòng)態(tài)注冊(cè),而動(dòng)態(tài)注冊(cè)的話,是在代碼中注冊(cè)的,這種注冊(cè)方式也叫非常駐型廣播,受到生命周期的影響,退出頁(yè)面后,就不會(huì)收到廣播,我們通常運(yùn)用在更新UI方面。這種注冊(cè)方式優(yōu)先級(jí)較高。最后需要解綁,否會(huì)會(huì)內(nèi)存泄露

廣播是分為有序廣播和無(wú)序廣播。

5、HttpClient與HttpUrlConnection的區(qū)別

此處延伸:Volley里用的哪種請(qǐng)求方式

首先HttpClientHttpUrlConnection這兩種方式都支持Https協(xié)議,都是以流的形式進(jìn)行上傳或者下載數(shù)據(jù),也可以說(shuō)是以流的形式進(jìn)行數(shù)據(jù)的傳輸,還有ipv6,以及連接池等功能。HttpClient這個(gè)擁有非常多的API,所以如果想要進(jìn)行擴(kuò)展的話,并且不破壞它的兼容性的話,很難進(jìn)行擴(kuò)展,也就是這個(gè)原因,GoogleAndroid6.0的時(shí)候,直接就棄用了這個(gè)HttpClient.

HttpUrlConnection相對(duì)來(lái)說(shuō)就是比較輕量級(jí)了,API比較少,容易擴(kuò)展,并且能夠滿足Android大部分的數(shù)據(jù)傳輸。比較經(jīng)典的一個(gè)框架volley,在Android 2.3版本以前都是使用Android HttpClient,在Android 2.3以后就使用了HttpUrlConnection

6、java虛擬機(jī)和Dalvik虛擬機(jī)的區(qū)別

Java虛擬機(jī):
1、java虛擬機(jī)基于棧。
基于棧的機(jī)器必須使用指令來(lái)載入和操作棧上數(shù)據(jù),所需指令更多更多。
2、java虛擬機(jī)運(yùn)行的是java字節(jié)碼。
java類會(huì)被編譯成一個(gè)或多個(gè)字節(jié)碼.class文件.

Dalvik虛擬機(jī):
1、dalvik虛擬機(jī)是基于寄存器的
2、Dalvik運(yùn)行的是自定義的.dex字節(jié)碼格式。
java類被編譯成.class文件后,會(huì)通過(guò)一個(gè)dx工具將所有的.class文件轉(zhuǎn)換成一個(gè).dex文件,然后dalvik虛擬機(jī)會(huì)從其中讀取指令和數(shù)據(jù).
3、常量池已被修改為只使用32位的索引,以 簡(jiǎn)化解釋器。
4、一個(gè)應(yīng)用,一個(gè)虛擬機(jī)實(shí)例,一個(gè)進(jìn)程
所有android應(yīng)用的線程都是對(duì)應(yīng)一個(gè)linux線程,都運(yùn)行在自己的沙盒中,不同的應(yīng)用在不同的進(jìn)程中運(yùn)行。每個(gè)android dalvik應(yīng)用程序都被賦予了一個(gè)獨(dú)立的linux PID(app_*)

7、進(jìn)程保活(不死進(jìn)程)
8、講解一下Context
9、理解Activity,View,Window三者關(guān)系
10、四種LaunchMode及其使用場(chǎng)景
11、View的繪制流程
12、View,ViewGroup事件分發(fā)
13、保存Activity狀態(tài)

onSaveInstanceState(Bundle)會(huì)在activity轉(zhuǎn)入后臺(tái)狀態(tài)之前被調(diào)用,也就是onStop()方法之前,onPause方法之后被調(diào)用;

14、Android中的幾種動(dòng)畫

幀動(dòng)畫:
指通過(guò)指定每一幀的圖片和播放時(shí)間,有序的進(jìn)行播放而形成動(dòng)畫效果,比如想聽(tīng)的律動(dòng)條。

補(bǔ)間動(dòng)畫:
指通過(guò)指定View的初始狀態(tài)、變化時(shí)間、方式,通過(guò)一系列的算法去進(jìn)行圖形變換,從而形成動(dòng)畫效果,主要有AlphaScale、Translate、Rotate四種效果。
注意:只是在視圖層實(shí)現(xiàn)了動(dòng)畫效果,并沒(méi)有真正改變View的屬性,比如滑動(dòng)列表,改變標(biāo)題欄的透明度。

屬性動(dòng)畫:
Android3.0的時(shí)候才支持,通過(guò)不斷的改變View的屬性,不斷的重繪而形成動(dòng)畫效果。相比于視圖動(dòng)畫,View的屬性是真正改變了。比如view的旋轉(zhuǎn),放大,縮小。

15、Android中跨進(jìn)程通訊的幾種方式

Android跨進(jìn)程通信,像intentcontentProvider,廣播,service都可以跨進(jìn)程通信。

intent:
這種跨進(jìn)程方式并不是訪問(wèn)內(nèi)存的形式,它需要傳遞一個(gè)uri,比如說(shuō)打電話。

contentProvider:
這種形式,是使用數(shù)據(jù)共享的形式進(jìn)行數(shù)據(jù)共享。

service:
遠(yuǎn)程服務(wù),比如aidl

廣播:
廣播 包含靜態(tài)廣播,動(dòng)態(tài)廣播。

16、AIDL理解
17、Handler的原理

Android中主線程是不能進(jìn)行耗時(shí)操作的,子線程是不能進(jìn)行更新UI的。所以就有了handler,它的作用就是實(shí)現(xiàn)線程之間的通信。

handler整個(gè)流程中,主要有四個(gè)對(duì)象,
handlerMessage,MessageQueue,Looper。當(dāng)應(yīng)用創(chuàng)建的時(shí)候,就會(huì)在主線程中創(chuàng)建handler對(duì)象,

我們通過(guò)要傳送的消息保存到Message中,handler通過(guò)調(diào)用sendMessage方法將Message發(fā)送到MessageQueue中,Looper對(duì)象就會(huì)不斷的調(diào)用loop()方法

不斷的從MessageQueue中取出Message交給handler進(jìn)行處理。從而實(shí)現(xiàn)線程之間的通信。

18、Binder機(jī)制原理

Android系統(tǒng)的Binder機(jī)制中,是有Client,Service,ServiceManager,Binder驅(qū)動(dòng)程序組成的,其中Clientservice,Service Manager運(yùn)行在用戶空間,Binder驅(qū)動(dòng)程序是運(yùn)行在內(nèi)核空間的。而Binder就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder驅(qū)動(dòng)程序,Service Manager提供輔助管理的功能,而ClientService正是在Binder驅(qū)動(dòng)程序和Service Manager提供的基礎(chǔ)設(shè)施上實(shí)現(xiàn)C/S之間的通信。其中Binder驅(qū)動(dòng)程序提供設(shè)備文件/dev/binder與用戶控件進(jìn)行交互,Client、ServiceService Manager通過(guò)openioctl文件操作相應(yīng)的方法與Binder驅(qū)動(dòng)程序進(jìn)行通信。而ClientService之間的進(jìn)程間通信是通過(guò)Binder驅(qū)動(dòng)程序間接實(shí)現(xiàn)的。而Binder Manager是一個(gè)守護(hù)進(jìn)程,用來(lái)管理Service,并向Client提供查詢Service接口的能力。

19、熱修復(fù)的原理

我們知道 Java虛擬機(jī) —— JVM是加載類的class文件的,而Android虛擬機(jī)——Dalvik/ART VM是加載類的dex文件,而他們加載類的時(shí)候都需要ClassLoader,ClassLoader有一個(gè)子BaseDexClassLoader,而BaseDexClassLoader下有一個(gè)數(shù)組——DexPathList,是用來(lái)存放dex文件,當(dāng)BaseDexClassLoader通過(guò)調(diào)用findClass方法時(shí),實(shí)際上就是遍歷數(shù)組,找到相應(yīng)的dex文件,找到,則直接將它return。而熱修復(fù)的解決方法就是將新的dex添加到該集合中,并且是在舊的dex的前面,所以就會(huì)優(yōu)先被取出來(lái)并且return返回。
`

20、Android內(nèi)存泄露及管理
22、Android UI適配

字體使用sp,
dp,多使用match_parent,wrap_content,weight
圖片資源,不同圖片的的分辨率,放在相應(yīng)的文件夾下可使用百分比代替。

23、app優(yōu)化
21、Fragment與Fragment、Activity通信的方式
24、圖片優(yōu)化

(1)對(duì)圖片本身進(jìn)行操作。
盡量不要使用setImageBitmap、setImageResourceBitmapFactory.decodeResource來(lái)設(shè)置一張大圖,因?yàn)檫@些方法在完成decode后,最終都是通過(guò) java 層的 createBitmap來(lái)完成的,需要消耗更多內(nèi)存.
(2)圖片進(jìn)行縮放的比例,SDK中建議其值是2的指數(shù)值,值越大會(huì)導(dǎo)致圖片不清晰。
(3)不用的圖片記得調(diào)用圖片的recycle()方法

25、HybridApp WebView和JS交互
26、JAVA GC原理

垃圾收集算法的核心思想是:
對(duì)虛擬機(jī)可用內(nèi)存空間,即堆空間中的對(duì)象進(jìn)行識(shí)別,如果對(duì)象正在被引用,那么稱其為存活對(duì)象,反之,如果對(duì)象不再被引用,則為垃圾對(duì)象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能。

27、ANR

ANR全名Application Not Responding, 也就是"應(yīng)用無(wú)響應(yīng)". 當(dāng)操作在一段時(shí)間內(nèi)系統(tǒng)無(wú)法處理時(shí), 系統(tǒng)層面會(huì)彈出上圖那樣的ANR對(duì)話框.

產(chǎn)生原因:
(1)5s內(nèi)無(wú)法響應(yīng)用戶輸入事件(例如鍵盤輸入, 觸摸屏幕等).
(2)BroadcastReceiver在10s內(nèi)無(wú)法結(jié)束
(3)Service 20s內(nèi)無(wú)法結(jié)束(低概率)

解決方式:
(1)不要在主線程中做耗時(shí)的操作,而應(yīng)放在子線程中來(lái)實(shí)現(xiàn)。如onCreate()和onResume()里盡可能少的去做創(chuàng)建操作。
(2)應(yīng)用程序應(yīng)該避免在BroadcastReceiver里做耗時(shí)的操作或計(jì)算。
(3)避免在Intent Receiver里啟動(dòng)一個(gè)Activity,因?yàn)樗鼤?huì)創(chuàng)建一個(gè)新的畫面,并從當(dāng)前用戶正在運(yùn)行的程序上搶奪焦點(diǎn)。
(4)service是運(yùn)行在主線程的,所以在service中做耗時(shí)操作,必須要放在子線程中。

28、設(shè)計(jì)模式
29、Xutils, OKhttp, Volley, Retrofit對(duì)比
30、MVP,MVC,MVVM
31、JNI

(1)安裝和下載Cygwin,下載 Android NDK
(2)在ndk項(xiàng)目中JNI接口的設(shè)計(jì)
(3)使用C/C++實(shí)現(xiàn)本地方法
(4)JNI生成動(dòng)態(tài)鏈接庫(kù).so文件
(5)將動(dòng)態(tài)鏈接庫(kù)復(fù)制到java工程,在java工程中調(diào)用,運(yùn)行java工程即可

32、RecyclerView和ListView的區(qū)別

RecyclerView可以完成ListView,GridView的效果,還可以完成瀑布流的效果。同時(shí)還可以設(shè)置列表的滾動(dòng)方向(垂直或者水平);
RecyclerViewview的復(fù)用不需要開(kāi)發(fā)者自己寫代碼,系統(tǒng)已經(jīng)幫封裝完成了。
RecyclerView可以進(jìn)行局部刷新。
RecyclerView提供了API來(lái)實(shí)現(xiàn)item的動(dòng)畫效果。

在性能上:
如果需要頻繁的刷新數(shù)據(jù),需要添加動(dòng)畫,則RecyclerView有較大的優(yōu)勢(shì)。
如果只是作為列表展示,則兩者區(qū)別并不是很大。

以上就是“android中高級(jí)面試題有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI