一、如何優化自定義View
- 在要在onDraw或是onLayout()中去創建對象,因爲onDraw()方法可能會被頻繁調用,可以在view的構造函數中進行創建對象;
- 降低view的刷新頻率,儘可能減少不必要的調用invalidate()方法。或是調用帶四種參數不同類型的invalidate(),而不是調用無參的方法。無參變量需要刷新整個view,而帶參數的方法只需刷新指定部分的view。在onDraw()方法中減少冗餘代碼。
- 使用硬件加速,GPU硬件加速可以帶來性能增加。
- 狀態保存與恢復,如果因內存不足,Activity置於後臺被殺重啓時,View應儘可能保存自己屬性,可以重寫onSaveInstanceState和onRestoreInstanceState方法,狀態保存。
二、低版本SDK如何實現高版本api?
使用@TargetApi註解·
當代碼中有比AndroidManifest中設置的android:minSdkVersion版本更高的方法,此時編譯器會提示警告,解決方法是在方法上加上@SuppressLint("NewApi")或者@TargetApi()。但它們僅是屏蔽了android lint錯誤,在方法中還要判斷版本做不同的操作。
@SuppressLint("NewApi")屏蔽一切新api中才能使用的方法報的android lint錯誤
@TargetApi() 只屏蔽某一新api中才能使用的方法報的android lint錯誤,如@TargetApi(11)如果在方法中用了只有API14纔開始有的方法,還是會報錯。
三、描述一次網絡請求的流程
1)域名解析
瀏覽器會先搜索自身DNS緩存且對應的IP地址沒有過期;若未找到則搜索操作系統自身的DNS緩存;若還未找到則讀本地的hotsts文件;還未找到會在TCP/IP設置的本地DNS服務器上找,如果要查詢的域名在本地配置的區域資源中,則完成解析;否則根據本地DNS服務器會請求根DNS服務器;根DNS服務器是13臺根DNS,會一級一級往下找。
2)TCP三次握手
客戶端先發送SYN=1,ACK=0,序列號seq=x報文;(SYN在連接建立時用來同步序號,SYN=1,ACK=0代表這是一個連接請求報文,對方若同意建立連接,則應在響應報文中使SYN=1,ACK=1)
服務器返回SYN=1,ACK=1,seq=y, ack=x+1;
客戶端再一次確認,但不用SYN了,回覆服務端, ACK=1, seq=x+1, ack=y+1
3)建立TCP連接後發起HTTP請求
客戶端按照指定的格式開始向服務端發送HTTP請求,HTTP請求格式由四部分組成,分別是請求行、請求頭、空行、消息體,服務端接收到請求後,解析HTTP請求,處理完成邏輯,最後返回一個具有標準格式的HTTP響應給客戶端。
4)服務器響應HTTP請求
服務器接收處理完請求後返回一個HTTP響應消息給客戶端,HTTP響應信息格式包括:狀態行、響應頭、空行、消息體
5)瀏覽器解析HTML代碼,請求HTML代碼中的資源
瀏覽器拿到html文件後,就開始解析其中的html代碼,遇到js/css/image等靜態資源時,向服務器發起一個http請求,如果返回304狀態碼,瀏覽器會直接讀取本地的緩存文件。否則開啓線程向服務器請求下載。
6)瀏覽器對頁面進行渲染並呈現給用戶
7)TCP的四次揮手
當客戶端沒有東西要發送時就要釋放連接(提出中斷連接可以是Client也可以是Server),客戶端會發送一個FIN=1的沒有數據的報文,進入FIN_WAIT狀態,服務端收到後會給客戶端一個確認,此時客戶端不能發送數據,但可接收信息。
四、HttpUrlConnection 和 okhttp關係
兩者都可以用來實現網絡請求,android4.4之後的HttpUrlConnection的實現是基於okhttp
- Bitmap對象的理解
- looper架構
- ActivityThread,AMS,WMS的工作原理
- 自定義View如何考慮機型適配
在onMeasure()
的getDefaultSize()
的默認實現中,當view的測量模式是AT_MOST或EXACTLY時,View的大小都會被設置成子View MeasureSpe
c的specSize
.子view的MeasureSpec
值是根據子View的佈局參數和父容器的MeasureSpec
值計算得來。當子view的佈局參數是wrap_content時,對應的測量模式是AT_MOST,大小是parentSize
,
- 自定義View的事件
- AstncTask+HttpClient 與 AsyncHttpClient有什麼區別?
- LaunchMode應用場景
- AsyncTask 如何使用?
- SpareArray原理
- 請介紹下ContentProvider 是如何實現數據共享的?
- AndroidService與Activity之間通信的幾種方式
- IntentService原理及作用是什麼?
原理:IntentService
是繼承Service的一個抽象類,它在onCreate()
方法中創建了一個HandlerThread
,並啓動該線程。HandlerThread
是帶有自己消息隊列和Looper
的線程,根據HandlerThread
的looper
創建一個Handler,這樣IntentService
的ServiceHandler
的handleMessage()
方法就運行在子線程中。handleMessage
中調用了onHandleIntent()
方法,它是一個抽象方法,繼承IntentService
類需要實現該方法,把耗時操作放在onHandleIntent()
方法中,等耗時操作運行完成後,會調用stopSelf()
方法,服務會調用onDestory()
方法消毀自己。如果onHandleIntent()
中的耗時操作未運行完前就調用了stopSelf()
方法,服務調用onDestory()
方法,但耗時操作會繼續運行,直至運行完畢。如果同時多次啓動IntentService
,任務會放在一個隊列中,onCreate()
和onDestory()
方法都只會運行一次。
作用:用來處理後臺耗時操作,如讀取數據庫或是本地文件等。
- 說說Activity、Intent、Service 是什麼關係
- ApplicationContext和ActivityContext的區別
- SP是進程同步的嗎?有什麼方法做到同步?
- 談談多線程在Android中的使用
- 進程和 Application 的生命週期
- 封裝View的時候怎麼知道view的大小
- RecycleView原理
- AndroidManifest的作用與理解
漫漫開發之路,我們只是其中的一小部分……只有不斷的學習、進階,纔是我們的出路!纔跟得上時代的進步!
今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【學習】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。