1.socket編程,socke的工作原理,以及怎么創(chuàng)建請(qǐng)求?
答:我們經(jīng)常把socket翻譯為套接字,socket是在應(yīng)用層和傳輸層之間的一個(gè)抽象層,它把TCP/IP層復(fù)雜的操作抽象為幾個(gè)簡(jiǎn)單的接口供應(yīng)用層調(diào)用已實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。我們知道網(wǎng)絡(luò)層的ip地址可以唯一標(biāo)示主機(jī),而傳輸層TC協(xié)議和端口號(hào)可以唯一標(biāo)示主機(jī)的一個(gè)進(jìn)程,這樣我們可以利用ip地址+協(xié)議+端口號(hào)唯一標(biāo)示網(wǎng)絡(luò)中的一個(gè)進(jìn)程。能夠唯一標(biāo)示網(wǎng)絡(luò)中的進(jìn)程后,它們就可以利用socket進(jìn)行通信了。socket是一種"打開—讀/寫—關(guān)閉"模式的實(shí)現(xiàn),服務(wù)器和客戶端各自維護(hù)一個(gè)"文件",通過對(duì)方的ip和端口號(hào)創(chuàng)建socket, 建立后,可以向自己文件寫入內(nèi)容供對(duì)方讀取或者讀取對(duì)方內(nèi)容,通訊結(jié)束時(shí)關(guān)閉文件。
2.IntentService和Service的關(guān)系,Activity之間怎樣傳遞數(shù)據(jù),
答:IntentService是Service的子類。IntentService在執(zhí)行onCreate的方法的時(shí)候,開了一個(gè)線程HandlerThread,并獲得了當(dāng)前線程隊(duì)列管理的looper,并且在onStart的時(shí)候,把消息置入了消息隊(duì)列,在消息被handler接受并且回調(diào)的時(shí)候,執(zhí)行了onHandlerIntent()方法,該方法的實(shí)現(xiàn)是子類去做的。這個(gè)方法里可以執(zhí)行耗時(shí)操作。
傳遞數(shù)據(jù)方式:
(1) 廣播方式? (2) AIDL? (3)接口回調(diào) (4)共享文件(如SharedPreference,注意同一時(shí)間不能同時(shí)讀寫)? (5)Handler的Messager交互
3.ContentProvieder的理解
Android四大組件之一,為存儲(chǔ)和獲取數(shù)據(jù)提供統(tǒng)一的接口,可以在不同的應(yīng)用程序之間共享數(shù)據(jù)。把所有數(shù)據(jù)組織成表,提供增刪改查,用URI來統(tǒng)一標(biāo)識(shí)資源。
4.TCP、UDP的區(qū)別
TCP傳輸控制協(xié)議,是一種提供可靠數(shù)據(jù)傳輸?shù)耐ㄓ脜f(xié)議。
UDP用戶數(shù)據(jù)報(bào)協(xié)議,是一個(gè)面向無連接的協(xié)議。如廣播
5. OOM異常是什么 ,OOM現(xiàn)象怎么處理
OOM全稱為Out of Memory,內(nèi)存溢出。常見導(dǎo)致OOM場(chǎng)景有
(1)加載超大的Bitmap (通過壓縮質(zhì)量,且使用完注意recycle()回收)
? (2) ?查詢數(shù)據(jù)庫(kù)未關(guān)閉游標(biāo)
? (3) ?構(gòu)造Adapter 時(shí),沒有使用緩存的convertView
總之對(duì)使用完的資源,注意及時(shí)釋放。
6.如何監(jiān)聽動(dòng)畫點(diǎn)擊事件
監(jiān)聽當(dāng)前執(zhí)行動(dòng)畫的View即可(面試官傻掉了?)
7.Android四大組件以及對(duì)四大組件的基本認(rèn)知
Activity:承載頁面與用戶交互,處理操作
Service:后臺(tái)運(yùn)行,相比于Activity是無界面的
BroadCast: ?異步廣播
ContentProvider: 提供統(tǒng)一的對(duì)數(shù)據(jù)集標(biāo)準(zhǔn),可用于應(yīng)用程序之間數(shù)據(jù)共享
8.談?wù)剬?duì)視圖渲染的原理
CPU在圖像繪制之前向GPU輸入指令這一過程通過OpenGL-ES也就是說在屏幕繪制UI對(duì)象的時(shí)候都需要在CPU中轉(zhuǎn)化成多邊形再傳遞GPU進(jìn)行格柵化操作,格柵化操作完成的格柵化將字符串,按鈕,路徑或者形狀的一些高級(jí)對(duì)象拆分到不同的像素上在屏幕上進(jìn)行顯示
9.View的事件傳遞機(jī)制
假設(shè)View的層級(jí)關(guān)系如下
<ViewGroup1>
? ?<ViewGroup2>
? ? ? ? ?<View>
? </ViewGroup2>
</ViewGroup1> ? ?
View事件傳遞順序ACTION_DOWN
由最上層ViewGroup通過dispathcTouchEvent,如果事件沒有被消費(fèi)(dispatchTouchEventreturn true),或者攔截(onInterceptTouchEventreturn true),就會(huì)逐層傳往下遞到最底層View,如下所示
Activity.dispatchTouchEvent-->ViewGroup1.dispatchTouchEvent-->ViewGroup1.onInterceptTouchEvent-->ViewGroup2.dispatchTouchEvent-->ViewGroup2.onInterceptTouchEvent-->View.dispatchTouchEvent
如果事件沒有被消費(fèi)(onTouchEventreturn true),會(huì)逐層往上調(diào)用onTouchEvent,如下所示
View.onTouchEvent()->ViewGroup1.onTouchEvent()->ViewGroup1.onTouchEvent()->Activity.onTouchEvent();
10.ART和Dalvik的區(qū)別
Dalvik Android 4.4 及其以下平臺(tái)使用的虛擬機(jī);
ART Android4.4以上平臺(tái)使用的虛擬機(jī)技術(shù);
在應(yīng)用程序啟動(dòng)時(shí),JIT通過進(jìn)行連續(xù)的性能分析來優(yōu)化程序代碼的執(zhí)行,在程序運(yùn)行的過程中,Dalvik虛擬機(jī)在不斷的進(jìn)行將字節(jié)碼編譯成機(jī)器碼的工作。
ART引入了AOT這種預(yù)編譯技術(shù),在應(yīng)用程序安裝的過程中,ART就已經(jīng)將所有的字節(jié)碼重新編譯成了機(jī)器碼。應(yīng)用程序運(yùn)行過程中無需進(jìn)行實(shí)時(shí)的編譯工作,只需要進(jìn)行直接調(diào)用.因此,ART極大的提高了應(yīng)用程序的運(yùn)行效率,同時(shí)也減少了手機(jī)的電量消耗,提高了移動(dòng)設(shè)備的續(xù)航能力,在垃圾回收等機(jī)制上也有了較大的提升。
相對(duì)于Dalvik虛擬機(jī)模式,ART模式下Android應(yīng)用程序的安裝需要消耗更多的時(shí)間,同時(shí)也會(huì)占用更大的儲(chǔ)存空間(指內(nèi)部?jī)?chǔ)存,用于儲(chǔ)存編譯后的代碼),但節(jié)省了很多Dalvik虛擬機(jī)用于實(shí)時(shí)編譯的時(shí)間
11.Listview怎樣優(yōu)化
復(fù)用convertView、ViewHolder的使用、圖片滑動(dòng)中不加載、item view布局優(yōu)化、getView盡量少邏輯
現(xiàn)在建議使用RecycleView來代替
12.如果使用webView在JS中調(diào)用java方法
Activity注冊(cè)Scheme,重寫WebViewClient,在shouldOverrideUrlLoading做攔截,處理邏輯即可。
13.項(xiàng)目開發(fā)使用什么工具
Android Studio是IDE、Git是版本控制工具、真機(jī)測(cè)試工具等其他輔助開發(fā)工具,如圖片壓縮處理的Tinypng
14.安卓熱修復(fù),插件化
熱修復(fù):運(yùn)行時(shí)實(shí)現(xiàn)對(duì)dex的替換,已達(dá)到動(dòng)態(tài)修復(fù)的目的
插件化:通過ClassLoader以及hook技術(shù)實(shí)現(xiàn)的apk的動(dòng)態(tài)拔插
15.如何創(chuàng)建線程,線程池及線程池的原理
創(chuàng)建線程: ?new Thread(new Runnable)
創(chuàng)建線程池: Executors.newCachedThreadPool();
Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創(chuàng)建一個(gè)可緩存線程池,如果線程池長(zhǎng)度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,可控制線程最大并發(fā)數(shù),超出的線程會(huì)在隊(duì)列中等待。
newScheduledThreadPool 創(chuàng)建一個(gè)定長(zhǎng)線程池,支持定時(shí)及周期性任務(wù)執(zhí)行。
newSingleThreadExecutor 創(chuàng)建一個(gè)單線程化的線程池,它只會(huì)用唯一的工作線程來執(zhí)行任務(wù),保證所有任務(wù)按照指定順序(FIFO, LIFO, 優(yōu)先級(jí))執(zhí)行。
16.Android跨進(jìn)程通訊都有那些方式
Intent、ContentProvider、BroadCast、Binder
17.網(wǎng)絡(luò)請(qǐng)求用什么框架
二次封裝Volley,Volley的Http實(shí)現(xiàn)用Okhttp替代。即為Volley+Okhttp
18.如果避免Viewpage的預(yù)加載數(shù)據(jù)
如果是與Fragment結(jié)合使用則通過setUserVisibleHint修改可見度來控制加載
也可以修改Android-support-v4包的源碼把viewpager.setOffscreenPageLimit(int num)可以設(shè)置預(yù)先加載的頁面?zhèn)€數(shù),默認(rèn)允許最小是1,可以改為0
19.Activity.Fragment,Service生命周期
Activity:OnCreate()->onStart()->onResume()->onPause()->onStop->onDestory
Fragment:onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResume->onPause->onStop->onDestroyView->onDestroy->onDetach
Service:
startService() ->onCreate()- >onStartCommand()->Service running--調(diào)用stopService() ->onDestroy()
bindService()->onCreate()->onBind()->Service running--調(diào)用>onUnbind() -> onDestroy()
20.什么是Acitivity
承載以及展示頁面,與用戶交互,處理操作
21. Service是否在main thread 中執(zhí)行,Service里面是否能執(zhí)行耗時(shí)的操作?
Service不是獨(dú)立的進(jìn)程,也不是獨(dú)立的線程,它是依賴于應(yīng)用程序的主線程的。所以不能進(jìn)行耗時(shí)操作。如果想做應(yīng)該單獨(dú)開線程或者使用IntentService
22. 說說Activity、Intent、Service是什么關(guān)系
intent是activity和service的橋梁,通信員,activity主要操作顯示界面,service在后臺(tái)運(yùn)行,適合長(zhǎng)時(shí)間運(yùn)行,如下載,聽歌等
23. 請(qǐng)介紹一下Android的數(shù)據(jù)存儲(chǔ)方式
1、使用SharedPreferences存儲(chǔ)數(shù)據(jù);
2、文件存儲(chǔ)數(shù)據(jù);
3、SQLite數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù);
4、使用ContentProvider存儲(chǔ)數(shù)據(jù);
5、網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù);
24. Listview如何實(shí)現(xiàn)分頁加載
1.定義分頁接口,關(guān)鍵三個(gè)字段。總數(shù)量count,當(dāng)前頁數(shù)pageIndex,每頁大小pageSize。
2.定義一個(gè)成員變量list來維護(hù)數(shù)據(jù),獲得分頁數(shù)據(jù)后使用addAll 把新數(shù)據(jù)添加進(jìn)來,adapter通知數(shù)據(jù)集有更新即可
25. Java中引用類型都有那些
1.強(qiáng)引用
這是使用最普遍的引用。如果一個(gè)對(duì)象具有強(qiáng)引用,那就 類似于必不可少的生活用品,垃圾回收器絕不會(huì)回收它。當(dāng)內(nèi)存空 間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來解決內(nèi)存不足問題。
2.軟引用(SoftReference)
如果一個(gè)對(duì)象只具有軟引用,那就類似于可有可物的生活用品。如果內(nèi)存空間足夠,垃圾回收器就不會(huì)回收它,如果內(nèi)存空間不足了,就會(huì)回收這些對(duì)象的內(nèi)存。只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。軟引用可用來實(shí)現(xiàn)內(nèi)存敏感的高速緩存。軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被垃圾回收,Java虛擬機(jī)就會(huì)把這個(gè)軟引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
3.弱引用(WeakReference)
如果一個(gè)對(duì)象只具有弱引用,那就類似于可有可物的生活用品。 弱引用與軟引用的區(qū)別在于:只具有弱引用的對(duì)象擁有更短暫的生命周期。在垃圾回收器線程掃描它 所管轄的內(nèi)存區(qū)域的過程中,一旦發(fā)現(xiàn)了只具有弱引用的對(duì)象,不管當(dāng)前內(nèi)存空間足夠與否,都會(huì)回收它的內(nèi)存。不過,由于垃圾回收器是一個(gè)優(yōu)先級(jí)很低的線程, 因此不一定會(huì)很快發(fā)現(xiàn)那些只具有弱引用的對(duì)象。弱引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果弱引用所引用的對(duì)象被垃圾回收,Java虛擬機(jī)就會(huì)把這個(gè)弱引用加入到與之關(guān)聯(lián)的引用隊(duì)列中。
4.虛引用(PhantomReference)
"虛引用"顧名思義,就是形同虛設(shè),與其他幾種引用都不同,虛引用并不會(huì)決定對(duì)象的生命周期。如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣,在任何時(shí)候都可能被垃圾回收。
26. Serializable和Parcelable的區(qū)別是?
Serializable(Java自帶):Serializable是序列化的意思,表示將一個(gè)對(duì)象轉(zhuǎn)換成可存儲(chǔ)或可傳輸?shù)臓顟B(tài)。序列化后的對(duì)象可以在網(wǎng)絡(luò)上進(jìn)行傳輸,也可以存儲(chǔ)到本地。
Parcelable(android 專用):除了Serializable之外,使用Parcelable也可以實(shí)現(xiàn)相同的效果,不過不同于將對(duì)象進(jìn)行序列化,Parcelable方式的實(shí)現(xiàn)原理是將一個(gè)完整的對(duì)象進(jìn)行分解,
27. Fragment和Activity之間如何通訊?
1.Fragment直接調(diào)用Activity中的public方法
2.使用接口回調(diào)方式
3.廣播方式
4.EventBus事件總線
5.文件共享
28. Android性能優(yōu)化
采用優(yōu)化布局層數(shù)。 采用
延時(shí)加載View. 采用ViewStub 避免一些不經(jīng)常的視圖長(zhǎng)期被引用,占用內(nèi)存.
移除Activity默認(rèn)背景,提升activity加載速度。
減少濫用static變量
布局減少嵌套,防止過度重繪
IO操作時(shí)記得關(guān)閉流
查詢完數(shù)據(jù)庫(kù)時(shí)關(guān)閉游標(biāo)
ListView的優(yōu)化
圖片用完記得及時(shí)回收
29. Android屏幕適配都有那些
1. 使用.9Path圖片
2.一套標(biāo)準(zhǔn)分辨率圖,布局單位使用db, 文字sp
3.考慮一屏不夠顯示情況,使用ScrollView
4.如果強(qiáng)制一屏顯示單獨(dú)適配可以定義多套dimens.xml?
30. Android中動(dòng)畫有哪幾類,他們的特點(diǎn)和區(qū)別是什么
第一是Tween動(dòng)畫(補(bǔ)間動(dòng)畫),
Tween動(dòng)畫:使試圖組件移動(dòng),放大,縮小以及產(chǎn)生透明度的變化。
第二是Frame動(dòng)畫(逐幀動(dòng)畫)。
Frame幀動(dòng)畫就是類似電影,由多張圖片切換而成。
第三是屬性動(dòng)畫 ?
通過動(dòng)畫的方式改變對(duì)象的屬性
31. 在項(xiàng)目中,你是如何緩存數(shù)據(jù)的?
1. 圖片、文件的緩存一般放在磁盤上
2. 本地DB緩存
3. SharedPreference數(shù)據(jù)放一些非安全性的量
32. 請(qǐng)簡(jiǎn)單說說,LinearLayout和RelativaLayout兩者的區(qū)別,并分別描述在什么情況下使用,對(duì)性能損耗更小
答: ?在具有多層嵌套的情況下,請(qǐng)考慮RelativeLayout以減少嵌套,這樣在解析布局文件時(shí)就會(huì)減少調(diào)用onMeasure和onLayout 提高性能
33.在開發(fā)中,你是ip直連,還是通過域名訪問?
答 ? ?一般通過域名訪問,但這種情況下會(huì)有被運(yùn)營(yíng)商DNS劫持的危險(xiǎn),常見的情況是h5頁面無緣無故增加了廣告
通過ip直連就解決了該問題,因?yàn)槭÷粤吮镜谼NS緩存服務(wù)器。