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
通過以上三種方法配合使用