您好,登錄后才能下訂單哦!
今天小編給大家分享一下android中高級(jí)面試題有哪些的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來(lái)了解一下吧。
onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()
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ì)象
此處延伸:什么情況下用動(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ú)序廣播。
此處延伸:Volley
里用的哪種請(qǐng)求方式
首先HttpClient
和HttpUrlConnection
這兩種方式都支持Https協(xié)議,都是以流的形式進(jìn)行上傳或者下載數(shù)據(jù),也可以說(shuō)是以流的形式進(jìn)行數(shù)據(jù)的傳輸,還有ipv6
,以及連接池等功能。HttpClient
這個(gè)擁有非常多的API,所以如果想要進(jìn)行擴(kuò)展的話,并且不破壞它的兼容性的話,很難進(jìn)行擴(kuò)展,也就是這個(gè)原因,Google
在Android6.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
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_*)
onSaveInstanceState(Bundle)
會(huì)在activity
轉(zhuǎn)入后臺(tái)狀態(tài)之前被調(diào)用,也就是onStop()
方法之前,onPause
方法之后被調(diào)用;
幀動(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)畫效果,主要有Alpha
、Scale
、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),放大,縮小。
Android
跨進(jìn)程通信,像intent
,contentProvider
,廣播,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)廣播。
Android
中主線程是不能進(jìn)行耗時(shí)操作的,子線程是不能進(jìn)行更新UI
的。所以就有了handler
,它的作用就是實(shí)現(xiàn)線程之間的通信。
handler整個(gè)流程中,主要有四個(gè)對(duì)象,handler
,Message
,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)線程之間的通信。
在Android
系統(tǒng)的Binder
機(jī)制中,是有Client
,Service
,ServiceManager
,Binder
驅(qū)動(dòng)程序組成的,其中Client
,service
,Service Manager
運(yùn)行在用戶空間,Binder
驅(qū)動(dòng)程序是運(yùn)行在內(nèi)核空間的。而Binder
就是把這4種組件粘合在一塊的粘合劑,其中核心的組件就是Binder
驅(qū)動(dòng)程序,Service Manager
提供輔助管理的功能,而Client
和Service
正是在Binder
驅(qū)動(dòng)程序和Service Manager
提供的基礎(chǔ)設(shè)施上實(shí)現(xiàn)C/S
之間的通信。其中Binder
驅(qū)動(dòng)程序提供設(shè)備文件/dev/binder
與用戶控件進(jìn)行交互,Client
、Service
,Service Manager
通過(guò)open
和ioctl
文件操作相應(yīng)的方法與Binder
驅(qū)動(dòng)程序進(jìn)行通信。而Client
和Service
之間的進(jìn)程間通信是通過(guò)Binder
驅(qū)動(dòng)程序間接實(shí)現(xiàn)的。而Binder Manager
是一個(gè)守護(hù)進(jìn)程,用來(lái)管理Service
,并向Client
提供查詢Service
接口的能力。
我們知道 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
返回。
`
字體使用sp
,dp
,多使用match_parent,wrap_content,weight
圖片資源,不同圖片的的分辨率,放在相應(yīng)的文件夾下可使用百分比代替。
(1)對(duì)圖片本身進(jìn)行操作。
盡量不要使用setImageBitmap
、setImageResource
、BitmapFactory.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()
方法
垃圾收集算法的核心思想是:
對(duì)虛擬機(jī)可用內(nèi)存空間,即堆空間中的對(duì)象進(jìn)行識(shí)別,如果對(duì)象正在被引用,那么稱其為存活對(duì)象,反之,如果對(duì)象不再被引用,則為垃圾對(duì)象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能。
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í)操作,必須要放在子線程中。
(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
工程即可
RecyclerView
可以完成ListView
,GridView
的效果,還可以完成瀑布流的效果。同時(shí)還可以設(shè)置列表的滾動(dòng)方向(垂直或者水平);RecyclerView
中view
的復(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è)資訊頻道。
免責(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)容。