Android面試知識(shí)整理-android基礎(chǔ)知識(shí)

Android面試知識(shí)整理-Java篇

1.okhttp原理:

運(yùn)用建造者模式,Dispatcher運(yùn)用線程池,底層封裝okio調(diào)用socket

2.Token業(yè)務(wù)邏輯:

3、進(jìn)程間通信:bundle/Intent、文件共享、Messenger、AIDL、ContentProvider、Socket

? ? ? 線程間通信:Handler、runOnUiThread、view.post(Runnable r)、AsyncTask、Evenbus、Rxjava

? ? ? Activity之間通信:Intent、類的靜態(tài)變量、全局變量Application、外部工具(sqlite、Sharedpreference、File)、bindService

Activity與Service通信方式:bindservice、接口回調(diào)、廣播、EvenBus、Rxjava

Activity與Fragment通信方式

1、在fragment調(diào)用Activity:getActivity()、接口回調(diào)、廣播、Evenbus、Rxjava

2、在Activity調(diào)用Fragment:setArguments()、接口回調(diào)、廣播、Evenbus、Rxjava

4、bind機(jī)制

AIDL:Stub和Proxy

Stub:接受數(shù)據(jù)

Proxy:發(fā)送數(shù)據(jù)(服務(wù)端的代理)

客戶端先通過asInterface拿到AIDL接口new一個(gè)Proxy,然后調(diào)用業(yè)務(wù)方法,接著調(diào)用客戶端transact,通過binder對(duì)象的一系列處理后,(服務(wù)端這里在內(nèi)核空間注冊(cè),生成一個(gè)業(yè)務(wù)方法的代理對(duì)象)調(diào)用服務(wù)端onTransact,客戶端transact返回結(jié)果

服務(wù)端new一個(gè)Stub,重寫業(yè)務(wù)方法

5、view事件分發(fā)

Activity分發(fā):源碼包括兩個(gè)方法,superDispatchTouchEvent和onTouchEvent,superDispatchTouchEvent實(shí)質(zhì)上調(diào)用ViewGroup(DecorView)的分發(fā)方法(實(shí)現(xiàn)事件傳遞),

(1)superDispatchTouchEvent返回true,說明事件被父ViewGroup處理,接著Activity返回true,分發(fā)結(jié)束;

(2)superDispatchTouchEvent返回false(即沒有被父ViewGroup處理),調(diào)用onTouchEvent方法;

(3)onTouchEvent返回true,事件被Activity消費(fèi),點(diǎn)擊在Window邊界外,分發(fā)結(jié)束;

(4)onTouchEvent返回false,事件未被Activity消費(fèi),點(diǎn)擊在Window邊界內(nèi),分發(fā)結(jié)束;

ViewGroup分發(fā):

調(diào)用dispatchTouchEvent方法,調(diào)用onInterceptTouchEvent方法判斷是否攔截(可以設(shè)置disallowIntercept),返回true或(點(diǎn)擊空白處)攔截,調(diào)用父view的dispatchTouchEvent方法。

返回false不攔截,遍歷Viewgroup的子view,調(diào)用子View的dispatchTouchEvent,傳遞事件到view。

onTouchEvent為父view的方法

View事件分發(fā):

dispatchTouchEvent方法:

判斷三個(gè)條件同時(shí)為true,dispatchTouchEvent返回true,事件分發(fā)結(jié)束。三個(gè)條件為注冊(cè)mOnTouchListener、控件是否為enable、mOnTouchListener.onTouch。

dispatchTouchEvent返回false,調(diào)用onTouchEvent方法,在up事件中調(diào)用click事件,

onTouchEvent返回true分發(fā)結(jié)束;

onTouchEvent返回false,回調(diào)ViewGroup的父VIew的onTouchEvent;

整體流程

Activity的superDispatchTouchEvent默認(rèn)調(diào)用父ViewGroup的dispatchTouchEvent,接著調(diào)用onInterceptTouchEvent為false默認(rèn)不攔截,調(diào)用子View的dispatchTouchEvent返回false,調(diào)用View的onTouchEvent方法返回false,回調(diào)ViewGroup的dispatchTouchEven返回false,調(diào)用ViewGroup的父View的onTouchEvent,回調(diào)Activity的onTouchEvent,流程結(jié)束。

解決滑動(dòng)沖突:

1.如果滑動(dòng)方向不一致,通過兩點(diǎn)坐標(biāo)判斷是否攔截

如果滑動(dòng)方向一致,用外部攔截法和內(nèi)部攔截法解決

2,外部攔截法:攔截父View的ACTION_MOVE事件

3.內(nèi)部攔截法:子View重新parent.requestDisallowInterceptTouchEvent方法,同時(shí)父View也需要調(diào)onInterceptTouchEvent

通過以上三種方法配合使用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容