1?說(shuō)說(shuō)JVM垃圾回收機(jī)制。
http://blog.csdn.net/xiajian2010/article/details/17376453
http://www.itdecent.cn/p/8fa373ceb552?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
http://www.blogjava.net/fancydeepin/archive/2013/09/29/jvm_heep.html
Android 中的Dalvik和ART是什么,有啥區(qū)別?
http://www.itdecent.cn/p/58f817d176b7
Dalvik VM 和JVM的區(qū)別
https://www.zhihu.com/question/20207106
http://gudong.name/2017/04/14/jvm_vs_dalvik.html
2?Activity的啟動(dòng)模式?
http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/index.html
http://blog.csdn.net/zhangjg_blog/article/details/10923643
3?service和線程的關(guān)系??怎么讓一個(gè)service不死掉,一直運(yùn)行,service生命周期 service和Intentservice的區(qū)別
Service設(shè)置成START_STICKY,kill 后會(huì)被重啟(等待5秒左右),重傳Intent,保持與重啟前一樣
通過(guò) startForeground將進(jìn)程設(shè)置為前臺(tái)進(jìn)程,做前臺(tái)服務(wù),優(yōu)先級(jí)和前臺(tái)應(yīng)用一個(gè)級(jí)別,除非在系統(tǒng)內(nèi)存非常缺,否則此進(jìn)程不會(huì)被 kill
雙進(jìn)程Service:讓2個(gè)進(jìn)程互相保護(hù),其中一個(gè)Service被清理后,另外沒(méi)被清理的進(jìn)程可以立即重啟進(jìn)程
QQ黑科技:在應(yīng)用退到后臺(tái)后,另起一個(gè)只有 1 像素的頁(yè)面停留在桌面上,讓自己保持前臺(tái)狀態(tài),保護(hù)自己不被后臺(tái)清理工具殺死
在已經(jīng)root的設(shè)備下,修改相應(yīng)的權(quán)限文件,將App偽裝成系統(tǒng)級(jí)的應(yīng)用(Android4.0系列的一個(gè)漏洞,已經(jīng)確認(rèn)可行)
Android系統(tǒng)中當(dāng)前進(jìn)程(Process)fork出來(lái)的子進(jìn)程,被系統(tǒng)認(rèn)為是兩個(gè)不同的進(jìn)程。當(dāng)父進(jìn)程被殺死的時(shí)候,子進(jìn)程仍然可以存活,并不受影響。鑒于目前提到的在Android-Service層做雙守護(hù)都會(huì)失敗,我們可以fork出c進(jìn)程,多進(jìn)程守護(hù)。死循環(huán)在那檢查是否還存在,具體的思路如下(Android5.0以下可行)
用C編寫(xiě)守護(hù)進(jìn)程(即子進(jìn)程),守護(hù)進(jìn)程做的事情就是循環(huán)檢查目標(biāo)進(jìn)程是否存在,不存在則啟動(dòng)它。
在NDK環(huán)境中將1中編寫(xiě)的C代碼編譯打包成可執(zhí)行文件(BUILD_EXECUTABLE)。
主進(jìn)程啟動(dòng)時(shí)將守護(hù)進(jìn)程放入私有目錄下,賦予可執(zhí)行權(quán)限,啟動(dòng)它即可。
聯(lián)系廠商,加入白名單
Service兩種啟動(dòng)方式的區(qū)別
http://www.itdecent.cn/p/2fb6eb14fdec
IntentService有以下特點(diǎn):
(1)??它創(chuàng)建了一個(gè)獨(dú)立的工作線程來(lái)處理所有的通過(guò)onStartCommand()傳遞給服務(wù)的intents。
(2)??創(chuàng)建了一個(gè)工作隊(duì)列,來(lái)逐個(gè)發(fā)送intent給onHandleIntent()。
(3)??不需要主動(dòng)調(diào)用stopSelft()來(lái)結(jié)束服務(wù)。因?yàn)?,在所有的intent被處理完后,系統(tǒng)會(huì)自動(dòng)關(guān)閉服務(wù)。
(4)??默認(rèn)實(shí)現(xiàn)的onBind()返回null
(5)??默認(rèn)實(shí)現(xiàn)的onStartCommand()的目的是將intent插入到工作隊(duì)列中?
4?Activity生命周期
http://peiquan.blog.51cto.com/7518552/1277373
http://blog.csdn.net/johnsonblog/article/details/7838108
5?handler AsyncTask可能導(dǎo)致內(nèi)存泄漏 context可能導(dǎo)致的內(nèi)存泄露
http://droidyue.com/blog/2015/04/12/avoid-memory-leaks-on-context-in-android/index.html
http://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/
http://gold.xitu.io/entry/56d64b9e816dfa005943a55c
Handler Message obtain()對(duì)象池原理
http://www.itdecent.cn/p/e271ee639b68
6?自定義view?
http://blog.csdn.net/guolin_blog/article/details/12921889
自定義view四個(gè)構(gòu)造函數(shù)詳解
http://blog.csdn.net/zhao123h/article/details/52210732
7?設(shè)計(jì)模式?
8?工作中遇到一次最大困難時(shí)什么??你最后是怎么解決的????如果讓你再來(lái)一次你是否能夠解決的更好
9?listview里面的item怎么優(yōu)化,如果item的layout不同你要怎么優(yōu)化??listview?多type?復(fù)用?convertview?的解決方法
http://www.eoeandroid.com/thread-246995-1-1.html?_dsign=8fb6add2
10?職業(yè)規(guī)劃
11?JAVA?中堆和棧的區(qū)別
http://droidyue.com/blog/2014/12/07/differences-between-stack-and-heap-in-java/index.html
12?HandlerThread
http://blog.csdn.net/feiduclear_up/article/details/46840523
13?緩存Cache
http://blog.csdn.net/guolin_blog/article/details/28863651
14?Touch事件傳遞機(jī)制
http://www.open-open.com/lib/view/open1422428386548.html
15?解決屏幕適配
http://blog.csdn.net/lmj623565791/article/details/49990941
16 handler Asynctask內(nèi)部原理分析
http://blog.csdn.net/lmj623565791/article/details/38377229
http://blog.csdn.net/lmj623565791/article/details/38614699
17 動(dòng)畫(huà)
http://blog.csdn.net/guolin_blog/article/details/43536355
18.recyclerView 和 listview 的區(qū)別
RecyclerView的ViewHolder規(guī)范化
RecyclerView可以實(shí)現(xiàn)線性布局效果,網(wǎng)格布局效果,瀑布流布局效果
ListView具有setEmptyView() addHeaderView() addFooterView()
http://blog.csdn.net/lmj623565791/article/details/51854533
RecyclerView支持局部刷新
listview實(shí)現(xiàn)局部刷新https://juejin.im/entry/581bdee6570c35006094a30e
RecyclerView輕松實(shí)現(xiàn)item動(dòng)畫(huà)效果
RecyclerView沒(méi)有setOnItemClickListener() setOnItemLongClickListener() 而是實(shí)現(xiàn)了RecyclerView.OnItemTouchListener()
http://www.voidcn.com/blog/liaoinstan/article/p-5785579.html
RecyclerView自定義分割線
19.View的繪制流程
?? ?從ViewRoot的performTraversals()方法開(kāi)始依次調(diào)用perfromMeasure、performLayout和performDraw這三個(gè)方法。這三個(gè)方法分別完成頂級(jí)View的measure、layout和draw三大流程,其中perfromMeasure會(huì)調(diào)用measure,measure又會(huì)調(diào)用onMeasure,在onMeasure方法中則會(huì)對(duì)所有子元素進(jìn)行measure,這個(gè)時(shí)候measure流程就從父容器傳遞到子元素中了,這樣就完成了一次measure過(guò)程,接著子元素會(huì)重復(fù)父容器的measure,如此反復(fù)就完成了整個(gè)View樹(shù)的遍歷.
?? ?同理,performLayout和performDraw也分別完成perfromMeasure類(lèi)似的流程。通過(guò)這三大流程,分別遍歷整棵View樹(shù),就實(shí)現(xiàn)了Measure,Layout,Draw這一過(guò)程,View就繪制出來(lái)了。
AsyncTask
1、設(shè)置當(dāng)前AsyncTask的狀態(tài)為RUNNING,上面的switch也可以看出,每個(gè)異步任務(wù)在完成前只能執(zhí)行一次。
2、執(zhí)行了onPreExecute(),當(dāng)前依然在UI線程,所以我們可以在其中做一些準(zhǔn)備工作。
3、將我們傳入的參數(shù)賦值給了mWorker.mParams ,mWorker為一個(gè)Callable的子類(lèi),且在內(nèi)部的call()方法中,調(diào)用了doInBackground(mParams),然后得到的返回值作為postResult的參數(shù)進(jìn)行執(zhí)行;postResult中通過(guò)sHandler發(fā)送消息,最終sHandler的handleMessage中完成onPostExecute的調(diào)用。
4、exec.execute(mFuture),mFuture為真正的執(zhí)行任務(wù)的單元,將mWorker進(jìn)行封裝,然后由sDefaultExecutor交給線程池進(jìn)行執(zhí)行。
如果現(xiàn)在大家去面試,被問(wèn)到AsyncTask的缺陷,可以分為兩個(gè)部分說(shuō),在3.0以前,最大支持128個(gè)線程的并發(fā),10個(gè)任務(wù)的等待。在3.0以后,無(wú)論有多少任務(wù),都會(huì)在其內(nèi)部單線程執(zhí)行;
Handler源碼分析總結(jié)
1、首先Looper.prepare()在本線程中保存一個(gè)Looper實(shí)例,然后該實(shí)例中保存一個(gè)MessageQueue對(duì)象;因?yàn)長(zhǎng)ooper.prepare()在一個(gè)線程中只能調(diào)用一次,所以MessageQueue在一個(gè)線程中只會(huì)存在一個(gè)。
2、Looper.loop()會(huì)讓當(dāng)前線程進(jìn)入一個(gè)無(wú)限循環(huán),不端從MessageQueue的實(shí)例中讀取消息,然后回msg.target.dispatchMessage(msg)方法。
3、Handler的構(gòu)造方法,會(huì)首先得到當(dāng)前線程中保存的Looper實(shí)例,進(jìn)而與Looper實(shí)例中的MessageQueue想關(guān)聯(lián)。
4、Handler的sendMessage方法,會(huì)給msg的target賦值為handler自身,然后加入MessageQueue中。
5、在構(gòu)造Handler實(shí)例時(shí),我們會(huì)重寫(xiě)handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調(diào)用的方法。
webView
Android webView優(yōu)化
Android webView與js的交互
http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/index.html
Android性能優(yōu)化
布局優(yōu)化、繪制優(yōu)化、內(nèi)存泄露優(yōu)化、響應(yīng)速度優(yōu)化、ListView優(yōu)化、線程優(yōu)化以及一些性能優(yōu)化的建議。
布局優(yōu)化:盡量減少布局文件的層級(jí),刪除布局中無(wú)用的控件和層級(jí)。合理利用這幾大布局,包括Constraintlayout, 提供按需加載的功能
繪制優(yōu)化:onDraw()方法中不要?jiǎng)?chuàng)建新的局部對(duì)象,不要做耗時(shí)的任務(wù) GPU過(guò)度繪制?HierarchyView來(lái)檢測(cè) 開(kāi)發(fā)者選項(xiàng) 顯示開(kāi)發(fā)者過(guò)度繪制選項(xiàng)
內(nèi)存泄露優(yōu)化:context、handler、bitmap、單例模式、內(nèi)部類(lèi)、靜態(tài)變量、資源對(duì)象沒(méi)有關(guān)閉
Apk包大小的優(yōu)化 : webp,tinypng 開(kāi)啟資源壓縮,自動(dòng)刪除無(wú)用的資源,代碼混淆
圖片大小的優(yōu)化 : 對(duì)圖片針對(duì)屏幕的尺寸做相應(yīng)的壓縮處理
響應(yīng)速度優(yōu)化和ANR日志分析:避免在主線程中做耗時(shí)操作,系統(tǒng)會(huì)在/data/anr目錄下創(chuàng)建一個(gè)文件traces.txt
線程優(yōu)化 :?
避免創(chuàng)建過(guò)多的對(duì)象
不要過(guò)多使用枚舉,枚舉占用的內(nèi)存空間要比整型大
常量請(qǐng)使用static final 來(lái)修飾
使用一些Android特有的數(shù)據(jù)結(jié)構(gòu),比如SparseArray和Pair等,他們都具有更好的性能
適當(dāng)使用軟引用和弱引用
采用內(nèi)存緩存和磁盤(pán)緩存
盡量采用靜態(tài)內(nèi)部類(lèi),這樣可以避免潛在的由于內(nèi)部類(lèi)而導(dǎo)致的內(nèi)存泄露
https://academy.realm.io/cn/posts/droidcon-farber-improving-android-app-performance/
http://www.itdecent.cn/p/be05874965d4
https://mp.weixin.qq.com/s/SmW2ljasKSXC1zlwTLY-iQ
簡(jiǎn)單參考:主要是怎么來(lái)通過(guò)tools來(lái)進(jìn)行性能優(yōu)化
http://blog.csdn.net/yanbober/article/details/48394201
ViewStub 和 merge 的區(qū)別
在動(dòng)態(tài)加載布局時(shí),使用 ViewStub 的性能要比使用設(shè)置 View 的可見(jiàn)性高。因?yàn)殡m然把 View 的初始可見(jiàn) View.GONE,使其不可見(jiàn),但是在 Inflate 布局的時(shí)候 View 仍然會(huì)被 Inflate,也就是說(shuō)仍然會(huì)創(chuàng)建對(duì)象,會(huì)被實(shí)例化,會(huì)被設(shè)置屬性。也就是說(shuō),會(huì)耗費(fèi)內(nèi)存等資源。
內(nèi)存泄露檢測(cè)框架-leakcanary原理分析
https://juejin.im/entry/5928f6360ce463006b120c3c
自定義BaseAdapter
http://blog.csdn.net/lmj623565791/article/details/38902805
RelativeLayout和LinearLayout性能分析
http://www.itdecent.cn/p/8a7d059da746
1.RelativeLayout會(huì)讓子View調(diào)用2次onMeasure,LinearLayout 在有weight時(shí),也會(huì)調(diào)用子View2次onMeasure
2.RelativeLayout的子View如果高度和RelativeLayout不同,則會(huì)引發(fā)效率問(wèn)題,當(dāng)子View很復(fù)雜時(shí),這個(gè)問(wèn)題會(huì)更加嚴(yán)重。如果可以,盡量使用padding代替margin。
3.在不影響層級(jí)深度的情況下,使用LinearLayout和FrameLayout而不是RelativeLayout。
為什么Google給開(kāi)發(fā)者默認(rèn)新建了個(gè)RelativeLayout,而自己卻在DecorView中用了個(gè)LinearLayout。因?yàn)镈ecorView的層級(jí)深度是已知而且固定的,上面一個(gè)標(biāo)題欄,下面一個(gè)內(nèi)容欄。采用RelativeLayout并不會(huì)降低層級(jí)深度,所以此時(shí)在根節(jié)點(diǎn)上用LinearLayout是效率最高的。而之所以給開(kāi)發(fā)者默認(rèn)新建了個(gè)RelativeLayout是希望開(kāi)發(fā)者能采用盡量少的View層級(jí)來(lái)表達(dá)布局以實(shí)現(xiàn)性能最優(yōu),因?yàn)閺?fù)雜的View嵌套對(duì)性能的影響會(huì)更大一些。
19.MVP模式講解
http://blog.csdn.net/lmj623565791/article/details/46596109
20.多進(jìn)程通信方法,Binder實(shí)現(xiàn)機(jī)制
android?onSaveInstanceState方法
http://blog.sina.com.cn/s/blog_618199e60101g1k5.html
hashcode() 和 equals()?
http://www.cnblogs.com/skywang12345/p/3324958.html
Android中為啥會(huì)65535的限制,解釋下原因.
http://blog.csdn.net/u011733020/article/details/71481395
橫豎屏切換 Activity生命周期的變化
1、不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
Retrofit、Glide、okHttp源碼分析
Retrofit
http://www.itdecent.cn/p/45cb536be2f4
Retrofit.build()
?? ?new OkHttpClient()
?? ?create callbackExecutor(include main thread handler)
?? ?create CallAdapterFactory List
?? ??? ?創(chuàng)建默認(rèn)的defaultCallAdapterFactory(callbackExecutor)
?? ?create ConverterFactory List
?? ?new Retrofit
Retrofit.create() 使用動(dòng)態(tài)代理
?? ?create ServiceMethod使用緩存來(lái)獲取ServiceMethod
?? ??? ?create CallAdapter ExecutorCallAdapterFactory
?? ??? ?create responseConverter
?? ??? ?parseMethodAnnotation
?? ?new OkHttpCall()
?? ?adapter(okHttpCall)
ExecutorCallbackCall(Call<>) callAdapter.adapter(OkHttpCall<>)
ExecutorCallbackCall.equeue(new Callback<>)
?? ?okHttpCall.equeue(new Callback){
?? ??? ?handler.post(new Runnable(){
?? ??? ??? ?callback.onResponse
?? ??? ?})
?? ?}
requestConvertor
okhttp3.Request = okhttpCall.toRequest()
responseConvertor
Retrofit.Response = okhttpcall.toResponse()
Observable<> callAdapter.adapter(OkHttpCall<>)
Okhttp 和volley的比較
volley底層用的是httpclient 跟 HttpUrlConnection OkHttp底層用的是socket
volley不支持同步,不能post大數(shù)據(jù),不適合用來(lái)上傳文件,volley內(nèi)部有一個(gè)開(kāi)啟一個(gè)CacheDispatcher和4個(gè)默認(rèn)的NetworkDispatcher 如果一個(gè)request需要很耗時(shí)的話(huà) ?適合小的請(qǐng)求
okhttp支持同步,異步請(qǐng)求,實(shí)現(xiàn)了spdy http2 ?wesocket協(xié)議 http協(xié)議緩存 實(shí)現(xiàn)了NIO (估計(jì)有些讀者不理解 IO 和 NIO 的概念,這里姑且簡(jiǎn)單提下,這兩個(gè)都是 Java 中的概念,如果我從硬盤(pán)讀取數(shù)據(jù),第一種方式就是程序一直等,數(shù)據(jù)讀完后才能繼續(xù)操作,這種是最簡(jiǎn)單的也叫阻塞式 IO,還有一種就是你讀你的,我程序接著往下執(zhí)行,等數(shù)據(jù)處理完你再來(lái)通知我,然后再處理回調(diào)。而第二種就是 NIO 的方式,非阻塞式。 ) ?
okhttp 雖然不是google開(kāi)發(fā)的 但是已經(jīng)默認(rèn)作為Android的請(qǐng)求方式了
- 支持 SPDY ,共享同一個(gè)Socket來(lái)處理同一個(gè)服務(wù)器的所有請(qǐng)求,socket自動(dòng)選擇最好路線,并支持自動(dòng)重連,擁有自動(dòng)維護(hù)的socket連接池,減少握手次數(shù) - 擁有隊(duì)列線程池,輕松寫(xiě)并發(fā) - 如果SPDY不可用,則通過(guò)連接池來(lái)減少請(qǐng)求延時(shí) - 擁有Interceptors輕松處理請(qǐng)求與響應(yīng)(比如透明GZIP壓縮,LOGGING),無(wú)縫的支持GZIP來(lái)減少數(shù)據(jù)流量 - 基于Headers的緩存策略,緩存響應(yīng)數(shù)據(jù)來(lái)減少重復(fù)的網(wǎng)絡(luò)請(qǐng)求 -會(huì)從很多常用的連接問(wèn)題中自動(dòng)恢復(fù)。如果您的服務(wù)器配置了多個(gè)IP地址,當(dāng)?shù)谝粋€(gè)IP連接失敗的時(shí)候,OkHttp會(huì)自動(dòng)嘗試下一個(gè)IP。OkHttp還處理了代理服務(wù)器問(wèn)題和SSL握手失敗問(wèn)題。 -使用 OkHttp 無(wú)需重寫(xiě)您程序中的網(wǎng)絡(luò)代碼。OkHttp實(shí)現(xiàn)了幾乎和java.net.HttpURLConnection一樣的API。如果您用了 Apache HttpClient,則OkHttp也提供了一個(gè)對(duì)應(yīng)的okhttp-apache 模塊
Glide :http://blog.csdn.net/guolin_blog/article/details/53759439
okHttp的工作原理以及緩存機(jī)制
https://blog.piasy.com/2016/07/11/Understand-OkHttp/
線程池 Java內(nèi)存管理 多態(tài)
java內(nèi)存管理 :http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
線程池 :http://blog.csdn.net/lift_class/article/details/70216690
多線程通信
https://blog.csdn.net/u011240877/article/details/72863432
多線程經(jīng)典問(wèn)題 : 生產(chǎn)消費(fèi)者模型
https://blog.csdn.net/MONKEY_D_MENG/article/details/6251879
線程安全
進(jìn)程和線程的關(guān)系
Thread和Runnable的區(qū)別
http://www.cnblogs.com/yangdy/p/5274455.html
線程死鎖
http://blog.csdn.net/abc006250/article/details/8007233
http://blog.csdn.net/ns_code/article/details/17200937
APP架構(gòu)設(shè)計(jì)
工作中遇到最難的問(wèn)題以及解決方案
單例
http://blog.csdn.net/jason0539/article/details/23297037
強(qiáng)引用 軟引用 弱引用 虛引用
http://blog.csdn.net/mazhimazh/article/details/19752475
HTTP
http://blog.csdn.net/coder_pig/article/details/46312153
http://www.cnblogs.com/hanyonglu/archive/2012/02/19/2357842.html
HTTP header
http://www.cnblogs.com/nylcy/p/5474613.html
java線程面試題?
http://www.cnblogs.com/dolphin0520/p/3958019.html
http://blog.csdn.net/jackfrued/article/details/44921941
圖片處理
http://blog.csdn.net/guolin_blog/article/details/9316683
緩存
http://blog.csdn.net/guolin_blog/article/details/28863651
http://blog.csdn.net/guolin_blog/article/details/9316683
webview
http://www.itdecent.cn/p/3c94ae673e2a
Android多渠道打包
http://tech.meituan.com/android-apk-v2-signature-scheme.html
多進(jìn)程通信
從頭到尾總結(jié)一下:
1.Touch事件分發(fā)中只有兩個(gè)主角:ViewGroup和View。ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三個(gè)相關(guān)事件。View包含dispatchTouchEvent、onTouchEvent兩個(gè)相關(guān)事件。其中ViewGroup又繼承于View。
2.ViewGroup和View組成了一個(gè)樹(shù)狀結(jié)構(gòu),根節(jié)點(diǎn)為Activity內(nèi)部包含的一個(gè)ViwGroup。
3.觸摸事件由Action_Down、Action_Move、Aciton_UP組成,其中一次完整的觸摸事件中,Down和Up都只有一個(gè),Move有若干個(gè),可以為0個(gè)。
4.當(dāng)Acitivty接收到Touch事件時(shí),將遍歷子View進(jìn)行Down事件的分發(fā)。ViewGroup的遍歷可以看成是遞歸的。分發(fā)的目的是為了找到真正要處理本次完整觸摸事件的View,這個(gè)View會(huì)在onTouchEvent結(jié)果返回true。
5.當(dāng)某個(gè)子View返回true時(shí),會(huì)中止Down事件的分發(fā),同時(shí)在ViewGroup中記錄該子View。接下去的Move和Up事件將由該子View直接進(jìn)行處理。由于子View是保存在ViewGroup中的,多層ViewGroup的節(jié)點(diǎn)結(jié)構(gòu)時(shí),上級(jí)ViewGroup保存的會(huì)是真實(shí)處理事件的View所在的ViewGroup對(duì)象:如ViewGroup0-ViewGroup1-TextView的結(jié)構(gòu)中,TextView返回了true,它將被保存在ViewGroup1中,而ViewGroup1也會(huì)返回true,被保存在ViewGroup0中。當(dāng)Move和UP事件來(lái)時(shí),會(huì)先從ViewGroup0傳遞至ViewGroup1,再由ViewGroup1傳遞至TextView。
6.當(dāng)ViewGroup中所有子View都不捕獲Down事件時(shí),將觸發(fā)ViewGroup自身的onTouch事件。觸發(fā)的方式是調(diào)用super.dispatchTouchEvent函數(shù),即父類(lèi)View的dispatchTouchEvent方法。在所有子View都不處理的情況下,觸發(fā)Acitivity的onTouchEvent方法。
7.onInterceptTouchEvent有兩個(gè)作用:1.攔截Down事件的分發(fā)。2.中止Up和Move事件向目標(biāo)View傳遞,使得目標(biāo)View所在的ViewGroup捕獲Up和Move事件。
問(wèn):Android中為什么主線程不會(huì)因?yàn)長(zhǎng)ooper.loop()里的死循環(huán)卡死?
答:線程是一段可執(zhí)行的代碼,當(dāng)可執(zhí)行代碼執(zhí)行完成后,線程生命周期便終止,線程退出。對(duì)于主線程,我們是絕不希望運(yùn)行一段時(shí)間后自己就退出,那么如何保證能一直存活呢?簡(jiǎn)單做法就是可執(zhí)行代碼是能一直執(zhí)行下去的,死循環(huán)便能保證不會(huì)被退出,例如,Binder線程也是采用死循環(huán)的方法,通過(guò)循環(huán)方式不斷與Binder驅(qū)動(dòng)進(jìn)行讀寫(xiě)操作,當(dāng)然并非簡(jiǎn)單地死循環(huán),無(wú)消息時(shí)會(huì)休眠。真正會(huì)卡死主線程的操作是在回調(diào)方法中onCreate()、onStart()、onResume等操作時(shí)間過(guò)長(zhǎng),導(dǎo)致掉幀,甚至發(fā)生ANR,Looper.loop()本身不會(huì)導(dǎo)致應(yīng)用卡死。
dispatchTouchEvent源碼分析總結(jié)
觸摸控件(View)首先執(zhí)行dispatchTouchEvent方法。
在dispatchTouchEvent方法中先執(zhí)行onTouch方法,后執(zhí)行onClick方法(onClick方法在onTouchEvent中執(zhí)行,下面會(huì)分析)。
如果控件(View)的onTouch返回false或者mOnTouchListener為null(控件沒(méi)有設(shè)置setOnTouchListener方法)或者控件不是enable的情況下會(huì)調(diào)運(yùn)onTouchEvent,dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件不是enable的設(shè)置了onTouch方法也不會(huì)執(zhí)行,只能通過(guò)重寫(xiě)控件的onTouchEvent方法處理(上面已經(jīng)處理分析了),dispatchTouchEvent返回值與onTouchEvent返回一樣。
如果控件(View)是enable且onTouch返回true情況下,dispatchTouchEvent直接返回true,不會(huì)調(diào)用onTouchEvent方法。
Volley源碼分析總結(jié)
????1. 當(dāng)一個(gè)RequestQueue被成功申請(qǐng)后會(huì)開(kāi)啟一個(gè)CacheDispatcher和4個(gè)默認(rèn)的NetworkDispatcher。
????2. CacheDispatcher緩存調(diào)度器最為第一層緩沖,開(kāi)始工作后阻塞的從緩存序列mCacheQueue中取得請(qǐng)求;對(duì)于已經(jīng)取消的請(qǐng)求,標(biāo)記為跳過(guò)并結(jié)束這個(gè)請(qǐng)求;新的或者過(guò)期的請(qǐng)求,直接放入mNetworkQueue中由N個(gè)NetworkDispatcher進(jìn)行處理;已獲得緩存信息(網(wǎng)絡(luò)應(yīng)答)卻沒(méi)有過(guò)期的請(qǐng)求,由Request的parseNetworkResponse進(jìn)行解析,從而確定此應(yīng)答是否成功。然后將請(qǐng)求和應(yīng)答交由Delivery分發(fā)者進(jìn)行處理,如果需要更新緩存那么該請(qǐng)求還會(huì)被放入mNetworkQueue中。
????3. 將請(qǐng)求Request add到RequestQueue后對(duì)于不需要緩存的請(qǐng)求(需要額外設(shè)置,默認(rèn)是需要緩存)直接丟入mNetworkQueue交給N個(gè)NetworkDispatcher處理;對(duì)于需要緩存的,新的請(qǐng)求加到mCacheQueue中給CacheDispatcher處理;需要緩存,但是緩存列表中已經(jīng)存在了相同URL的請(qǐng)求,放在mWaitingQueue中做暫時(shí)處理,等待之前請(qǐng)求完畢后,再重新添加到mCacheQueue中。
? ??4. 網(wǎng)絡(luò)請(qǐng)求調(diào)度器NetworkDispatcher作為網(wǎng)絡(luò)請(qǐng)求真實(shí)發(fā)生的地方,對(duì)消息交給BasicNetwork進(jìn)行處理,同樣的,請(qǐng)求和結(jié)果都交由Delivery分發(fā)者進(jìn)行處理。
????5. Delivery分發(fā)者實(shí)際上已經(jīng)是對(duì)網(wǎng)絡(luò)請(qǐng)求處理的最后一層了,在Delivery對(duì)請(qǐng)求處理之前,Request已經(jīng)對(duì)網(wǎng)絡(luò)應(yīng)答進(jìn)行過(guò)解析,此時(shí)應(yīng)答成功與否已經(jīng)設(shè)定;而后Delivery根據(jù)請(qǐng)求所獲得的應(yīng)答情況做不同處理;若應(yīng)答成功,則觸發(fā)deliverResponse方法,最終會(huì)觸發(fā)開(kāi)發(fā)者為Request設(shè)定的Listener;若應(yīng)答失敗,則觸發(fā)deliverError方法,最終會(huì)觸發(fā)開(kāi)發(fā)者為Request設(shè)定的ErrorListener;處理完后,一個(gè)Request的生命周期就結(jié)束了,Delivery會(huì)調(diào)用Request的finish操作,將其從mRequestQueue中移除,與此同時(shí),如果等待列表中存在相同
URL的請(qǐng)求,則會(huì)將剩余的層級(jí)請(qǐng)求全部丟入mCacheQueue交由CacheDispatcher進(jìn)行處理。
接口抽象類(lèi)的區(qū)別
接口中所有的方法隱含的都是抽象的。而抽象類(lèi)則可以同時(shí)包含抽象和非抽象的方法。
類(lèi)可以實(shí)現(xiàn)很多個(gè)接口,但是只能繼承一個(gè)抽象類(lèi)
類(lèi)如果要實(shí)現(xiàn)一個(gè)接口,它必須要實(shí)現(xiàn)接口聲明的所有方法。但是,類(lèi)可以不實(shí)現(xiàn)抽象類(lèi)聲明的所有方法,當(dāng)然,在這種情況下,類(lèi)也必須得聲明成是抽象的。
抽象類(lèi)可以在不提供接口方法實(shí)現(xiàn)的情況下實(shí)現(xiàn)接口。
Java接口中聲明的變量默認(rèn)都是final的。抽象類(lèi)可以包含非final的變量。
Java接口中的成員函數(shù)默認(rèn)是public的。抽象類(lèi)的成員函數(shù)可以是private,protected或者是public。
接口是絕對(duì)抽象的,不可以被實(shí)例化。抽象類(lèi)也不可以被實(shí)例化,但是,如果它包含main方法的話(huà)是可以被調(diào)用的。
16.什么是死鎖(deadlock)?
兩個(gè)進(jìn)程都在等待對(duì)方執(zhí)行完畢才能繼續(xù)往下執(zhí)行的時(shí)候就發(fā)生了死鎖。結(jié)果就是兩個(gè)進(jìn)程都陷入了無(wú)限的等待中。
17.如何確保N個(gè)線程可以訪問(wèn)N個(gè)資源同時(shí)又不導(dǎo)致死鎖?
使用多線程的時(shí)候,一種非常簡(jiǎn)單的避免死鎖的方式就是:指定獲取鎖的順序,并強(qiáng)制線程按照指定的順序獲取鎖。因此,如果所有的線程都是以同樣的順序加鎖和釋放鎖,就不會(huì)出現(xiàn)死鎖了。
Array和ArrayList的不同點(diǎn):
Array可以包含基本類(lèi)型和對(duì)象類(lèi)型,ArrayList只能包含對(duì)象類(lèi)型。
Array大小是固定的,ArrayList的大小是動(dòng)態(tài)變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對(duì)于基本類(lèi)型數(shù)據(jù),集合使用自動(dòng)裝箱來(lái)減少編碼工作量。但是,當(dāng)處理固定大小的基本數(shù)據(jù)類(lèi)型的時(shí)候,這種方式相對(duì)比較慢。
20.什么是迭代器(Iterator)?
Iterator接口提供了很多對(duì)集合元素進(jìn)行迭代的方法。每一個(gè)集合類(lèi)都包含了可以返回迭代器實(shí)例的
迭代方法。迭代器可以在迭代的過(guò)程中刪除底層集合的元素。
克隆(cloning)或者是序列化(serialization)的語(yǔ)義和含義是跟具體的實(shí)現(xiàn)相關(guān)的。因此,應(yīng)該由集合類(lèi)的具體實(shí)現(xiàn)來(lái)決定如何被克隆或者是序列化。
21.Iterator和ListIterator的區(qū)別是什么?
下面列出了他們的區(qū)別:
Iterator可用來(lái)遍歷Set和List集合,但是ListIterator只能用來(lái)遍歷List。
Iterator對(duì)集合只能是前向遍歷,ListIterator既可以前向也可以后向。
ListIterator實(shí)現(xiàn)了Iterator接口,并包含其他的功能,比如:增加元素,替換元素,獲取前一個(gè)和后一個(gè)元素的索引,等等。
Comparable和Comparator接口是干什么的?列出它們的區(qū)別。
Java提供了只包含一個(gè)compareTo()方法的Comparable接口。這個(gè)方法可以個(gè)給兩個(gè)對(duì)象排序。具體來(lái)說(shuō),它返回負(fù)數(shù),0,正數(shù)來(lái)表明輸入對(duì)象小于,等于,大于已經(jīng)存在的對(duì)象。
Java提供了包含compare()和equals()兩個(gè)方法的Comparator接口。compare()方法用來(lái)給兩個(gè)輸入?yún)?shù)排序,返回負(fù)數(shù),0,正數(shù)表明第一個(gè)參數(shù)是小于,等于,大于第二個(gè)參數(shù)。equals()方法需要一個(gè)對(duì)象作為參數(shù),它用來(lái)決定輸入?yún)?shù)是否和comparator相等。只有當(dāng)輸入?yún)?shù)也是一個(gè)comparator并且輸入?yún)?shù)和當(dāng)前comparator的排序結(jié)果是相同的時(shí)候,這個(gè)方法才返回true。
thread runnable
字符串常量池
http://droidyue.com/blog/2014/12/21/string-literal-pool-in-java/index.html
字符串拼接
http://droidyue.com/blog/2014/08/30/java-details-string-concatenation/
并發(fā)
volatile的原理
http://www.cnblogs.com/dolphin0520/p/3920373.html
synchronized的原理
http://www.cnblogs.com/paddix/p/5367116.html
https://blog.csdn.net/xiao__gui/article/details/8188833
java.util.concurrent包詳解
http://blog.csdn.net/chenfengdejuanlian/article/details/54969339
synchronized與Lock的區(qū)別
wait()和sleep()區(qū)別
https://www.cnblogs.com/DreamSea/archive/2012/01/16/SleepAndWaitDifferent.html
數(shù)據(jù)結(jié)構(gòu)與算法
list map set 以及實(shí)現(xiàn)類(lèi)的原理
HashMap?
http://www.cnblogs.com/ITtangtang/p/3948406.html
LinkedList?
http://www.cnblogs.com/ITtangtang/p/3948610.html
ArrayList?
http://www.cnblogs.com/ITtangtang/p/3948555.html
ConcurrentHashMap?
http://www.cnblogs.com/dolphin0520/p/3932905.html
List Map Set 的區(qū)別
http://developer.51cto.com/art/201309/410205_all.htm
快速排序 :?
http://www.cnblogs.com/MOBIN/p/4681369.html
publicstaticvoidquickSort(intarr[],int_left,int_right){
???????intleft =_left;
???????intright =_right;
???????inttemp = 0;
???????if(left <=right){??//待排序的元素至少有兩個(gè)的情況
??????????? temp=arr[left];?//待排序的第一個(gè)元素作為基準(zhǔn)元素
???????????while(left !=right){??//從左右兩邊交替掃描,直到left = right
???????????????while(right > left && arr[right] >=temp)?
???????????????????? right--;??????//從右往左掃描,找到第一個(gè)比基準(zhǔn)元素小的元素
????????????????? arr[left]=arr[right];?//找到這種元素arr[right]后與arr[left]交換
???????????????while(left < right && arr[left] <=temp)
???????????????????? left++;???????//從左往右掃描,找到第一個(gè)比基準(zhǔn)元素大的元素
????????????????? arr[right]=arr[left];?//找到這種元素arr[left]后,與arr[right]交換
??????????? }
??????????? arr[right]=temp;??//基準(zhǔn)元素歸位
??????????? quickSort(arr,_left,left-1);?//對(duì)基準(zhǔn)元素左邊的元素進(jìn)行遞歸排序
??????????? quickSort(arr, right+1,_right);?//對(duì)基準(zhǔn)元素右邊的進(jìn)行遞歸排序
??????? }???????
??? }
二分查找:
http://blog.csdn.net/lovesummerforever/article/details/24588989
/**?
?????*?二分查找遞歸實(shí)現(xiàn)。?
?????*?@param?srcArray??有序數(shù)組?
?????*?@param?start?數(shù)組低地址下標(biāo)?
?????*?@param?end???數(shù)組高地址下標(biāo)?
?????*?@param?key??查找元素?
?????*?@return?查找元素不存在返回-1?
?????*/??
????public?static?int?binSearch(int?srcArray[],?int?start,?int?end,?int?key)?{??
????????int?mid?=?(end?-?start)?/?2?+?start;??
\ ? ? ?if?(srcArray[mid]?==?key)?{??
????????????return?mid;??
????????}??
????????if?(start?>=?end)?{??
????????????return?-1;??
????????}?else?if?(key?>?srcArray[mid])?{??
????????????return?binSearch(srcArray,?mid?+?1,?end,?key);??
????????}?else?if?(key?<?srcArray[mid])?{??
????????????return?binSearch(srcArray,?start,?mid?-?1,?key);??
????????}??
????????return?-1;??
????}??
數(shù)組去重:
http://www.gjnote.com/archives/459.html
自己實(shí)現(xiàn)一個(gè)Stack 實(shí)現(xiàn)單鏈表 數(shù)的深度遍歷 廣度遍歷
面經(jīng)
美團(tuán)面試
http://www.itdecent.cn/p/ab4d0c6e9481
國(guó)內(nèi)一線互聯(lián)網(wǎng)公司內(nèi)部面試題庫(kù)
https://github.com/JackyAndroid/AndroidInterview-Q-A/blob/master/README-CN.md#%E6%8E%A5%E5%8F%A3%E7%9A%84%E6%84%8F%E4%B9%89-%E7%99%BE%E5%BA%A6
美團(tuán)面試:
貓撲素?cái)?shù);1到n,求1的個(gè)數(shù);單詞反轉(zhuǎn)
算法實(shí)現(xiàn)下如何統(tǒng)計(jì)出Activity中view樹(shù)的深度。
public?int?findDeep1(BiTree?root)??
??{??
??????if(root?==?null)??
??????{??
??????????return?0;??
??????}??
??????else??
??????{??
???????int?lchilddeep?=?findDeep1(root.left);//求左子樹(shù)的深度??
???????int?rchilddeep?=?findDeep1(root.right);//求右子樹(shù)的深度??
???????return?lchilddeep?>?rchilddeep???lchilddeep?+?1?:?rchilddeep?+?1;//左子樹(shù)和右子樹(shù)深度較大的那個(gè)加一等于整個(gè)樹(shù)的深度??
??????}??
??}?
java內(nèi)存優(yōu)化方案
釋放連接
優(yōu)化邏輯,釋放不必要的對(duì)象 盡量使用局部變量
減少循環(huán)邏輯里的對(duì)象的創(chuàng)建
基本類(lèi)型代替對(duì)象類(lèi)型
使用stringBuffer和stringBuilder替代多次String對(duì)象 ?
單線程盡量使用hashmap和ArrayList
提前分配stringBuffer,數(shù)組,array,vector等容量
合適的場(chǎng)所使用單例
盡量不要隨意使用靜態(tài)變量
處理內(nèi)存泄露
HTTP和HTTPS的區(qū)別:
1、HTTP協(xié)議使用默認(rèn)80端口,HTTPS協(xié)議使用443端口
2、HTTPS協(xié)議需要到CA申請(qǐng)證書(shū),一般免費(fèi)的證書(shū)較少,需要交費(fèi)
3、HTTP信息是明文傳輸,HTTPS使用具有安全性的SSL加密傳輸信息
http1和http2的區(qū)別:
1.http2可以同時(shí)發(fā)多個(gè)請(qǐng)求
2.http2會(huì)壓縮,體積小
3.http2服務(wù)器會(huì)推送
加密算法有哪些?對(duì)稱(chēng)加密和非對(duì)稱(chēng)加密的區(qū)別??
MD5,SHA1,Base64,RSA,AES,DES?
非對(duì)稱(chēng)密鑰加密的使用過(guò)程:
1. A要向B發(fā)送信息,A和B都要產(chǎn)生一對(duì)用于加密和解密的公鑰和私鑰。
2. A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
3. A要給B發(fā)送信息時(shí),A用B的公鑰加密信息,因?yàn)锳知道B的公鑰。
4. A將這個(gè)消息發(fā)給B(已經(jīng)用B的公鑰加密消息)。
5. B收到這個(gè)消息后,B用自己的私鑰解密A的消息,其他所有收到這個(gè)報(bào)文的人都無(wú)法解密,因?yàn)橹挥蠦才有B的私鑰。
6. 反過(guò)來(lái),B向A發(fā)送消息也是一樣。
(1) 對(duì)稱(chēng)加密加密與解密使用的是同樣的密鑰,所以速度快,但由于需要將密鑰在網(wǎng)絡(luò)傳輸,所以安全性不高。
(2) 非對(duì)稱(chēng)加密使用了一對(duì)密鑰,公鑰與私鑰,所以安全性高,但加密與解密速度慢。
(3) 解決的辦法是將對(duì)稱(chēng)加密的密鑰使用非對(duì)稱(chēng)加密的公鑰進(jìn)行加密,然后發(fā)送出去,接收方使用私鑰進(jìn)行解密得到對(duì)稱(chēng)加密的密鑰,然后雙方可以使用對(duì)稱(chēng)加密來(lái)進(jìn)行溝通。
TCP的三次握手??jī)纱涡胁恍??為什么?TCP攻擊知道嗎?如何進(jìn)行攻擊?
gradle中buildToolsVersion和TargetSdkVersion的區(qū)別是什么
http://chinagdg.org/2016/01/picking-your-compilesdkversion-minsdkversion-targetsdkversion/
手機(jī)適配一些方案
靜態(tài)方法是否能被重寫(xiě)