编辑: cyhzg | 2019-07-15 |
1 2
3 4
5 6 目录 介绍 Android 网络 Java与JVM 其他 算法 需要默写的代码 面试
2 我的面试准备 本书是我面试Android工程师的常见面试题与准备 面试
3 介绍 Handler Handler创建的那个线程会在构造函数里面调Looper.
myLooper().然后会在Threadlocal里 面找到当前线程的looper产生关联. MessageQueue一个looper对应一个,looper在构造函数里面创建MessageQueue. looper调用了looper就会循环在Message里面取消息 handler发送Message,massage的target会设置为发送它的handler,然后放进 Messagequeue.最后被queue创建的线程的looper取出分发给handler的handlemessage() 方法. HandlerThread HandlerThread的getLooper()方法保证一定可以拿到非空返回值.如果Looper还没创建就 一直wait() 可以防止像子线程发消息的时候,子线程的handler创建的代码还没执行的情况.保证一定可 以收到消息 事件分发机制 对于一个根ViewGroup来说,发生点击事件首先调用dispatchTouchEvent 如果这个ViewGroup的onIterceptTouchEvent返回true就表示它要拦截当前事件,接着这个 ViewGroup的onTouchEvent就会被调用.如果onIterceptTouchEvent返回false,那么就会继 续向下调用子View的dispatchTouchEvent方法 当一个View需要处理事件的时候,如果它没有设置onTouchListener,那么直接调用 onTouchEvent.如果设置了Listenter 那么就要看Listener的onTouch方法返回值.为true就 不调,为false就调onTouchEvent(). View的默认实现会在onTouchEvent里面把touch事件解析成Click之类的事件 点击事件传递顺序 Activity ->
Window ->
View 一旦一个元素拦截了某事件,那么一个事件序列里面后续的Move,Down事件都会交给它处 理.并且它的onInterceptTouchEvent不会再调用 View的onTouchEvent默认都会消耗事件,除非它的clickable和longClickable都是false(不 可点击) View的enable属性不影响OnTouchEvent的返回值 Activity启动模式 面试
4 Android 任务栈是一种后进先出的结构,当按下back按钮的时候,栈内的Activity会一个一个的出栈,如果 栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名. standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,而不管这个Activity是 否已经存在.Activity的启动三回调都会执行. singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此 Activity不会被重新创建,所以它的启动三回调就不会执行,同时它的onNewIntent方法会被 回调.如果Activity已经存在但是不在栈顶,那么新的Activity仍然会重新创建. singleTask: 栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创 建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity 就会被调到栈顶,并运行onNewIntent(),并且singleTask会清理在当前Activity上面的所有 Activity.(clear top) singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内, 由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁 了TIP 用intent启动时指定的启动模式比写在menifest中的优先级要高. 当TaskAffinity和allowTaskReparenting结合的时候,这种情况比较复杂,会产生特殊的 效果.当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting为true的话,那么B启动后,那么这个新的Activity会转到B的任务 栈中. service的生命周期 2种启动的区别 startService() 启动本地服务 Local Service bindService() 启动远程服务 Remote Service ,bindService()可以绑定一个已有的service, 如果bind的service还没启动,就先启动然后再bind() 远程服务允许暴露接口并让系统内不同程序相互注册调用.LocalService无法抵抗一些系 统清理程序如MIUI自带的内存清除 Service在被创建之后都会进入回调onCreate()方法,随后根据启动方式分别回调 onStartCommand()方法和onBind()方法.如果Service是经由bindService()启动,则需要 所有client全部调用unbindService()才能将Service释放等待系统回收,最后onDestroy() 让Service不运行在主线程,可以在子线程内开启Service. 如何保证Service不被杀 面试