Android面试知识整理-android基础知识

Android面试知识整理-Java篇

1.okhttp原理:

运用建造者模式,Dispatcher运用线程池,底层封装okio调用socket

2.Token业务逻辑:

3、进程间通信:bundle/Intent、文件共享、Messenger、AIDL、ContentProvider、Socket

      线程间通信:Handler、runOnUiThread、view.post(Runnable r)、AsyncTask、Evenbus、Rxjava

      Activity之间通信:Intent、类的静态变量、全局变量Application、外部工具(sqlite、Sharedpreference、File)、bindService

Activity与Service通信方式:bindservice、接口回调、广播、EvenBus、Rxjava

Activity与Fragment通信方式

1、在fragment调用Activity:getActivity()、接口回调、广播、Evenbus、Rxjava

2、在Activity调用Fragment:setArguments()、接口回调、广播、Evenbus、Rxjava

4、bind机制

AIDL:Stub和Proxy

Stub:接受数据

Proxy:发送数据(服务端的代理)

客户端先通过asInterface拿到AIDL接口new一个Proxy,然后调用业务方法,接着调用客户端transact,通过binder对象的一系列处理后,(服务端这里在内核空间注册,生成一个业务方法的代理对象)调用服务端onTransact,客户端transact返回结果

服务端new一个Stub,重写业务方法

5、view事件分发

Activity分发:源码包括两个方法,superDispatchTouchEvent和onTouchEvent,superDispatchTouchEvent实质上调用ViewGroup(DecorView)的分发方法(实现事件传递),

(1)superDispatchTouchEvent返回true,说明事件被父ViewGroup处理,接着Activity返回true,分发结束;

(2)superDispatchTouchEvent返回false(即没有被父ViewGroup处理),调用onTouchEvent方法;

(3)onTouchEvent返回true,事件被Activity消费,点击在Window边界外,分发结束;

(4)onTouchEvent返回false,事件未被Activity消费,点击在Window边界内,分发结束;

ViewGroup分发:

调用dispatchTouchEvent方法,调用onInterceptTouchEvent方法判断是否拦截(可以设置disallowIntercept),返回true或(点击空白处)拦截,调用父view的dispatchTouchEvent方法。

返回false不拦截,遍历Viewgroup的子view,调用子View的dispatchTouchEvent,传递事件到view。

onTouchEvent为父view的方法

View事件分发:

dispatchTouchEvent方法:

判断三个条件同时为true,dispatchTouchEvent返回true,事件分发结束。三个条件为注册mOnTouchListener、控件是否为enable、mOnTouchListener.onTouch。

dispatchTouchEvent返回false,调用onTouchEvent方法,在up事件中调用click事件,

onTouchEvent返回true分发结束;

onTouchEvent返回false,回调ViewGroup的父VIew的onTouchEvent;

整体流程

Activity的superDispatchTouchEvent默认调用父ViewGroup的dispatchTouchEvent,接着调用onInterceptTouchEvent为false默认不拦截,调用子View的dispatchTouchEvent返回false,调用View的onTouchEvent方法返回false,回调ViewGroup的dispatchTouchEven返回false,调用ViewGroup的父View的onTouchEvent,回调Activity的onTouchEvent,流程结束。

解决滑动冲突:

1.如果滑动方向不一致,通过两点坐标判断是否拦截

如果滑动方向一致,用外部拦截法和内部拦截法解决

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

3.内部拦截法:子View重新parent.requestDisallowInterceptTouchEvent方法,同时父View也需要调onInterceptTouchEvent

通过以上三种方法配合使用

你可能感兴趣的:(Android面试知识整理-android基础知识)