1. 触摸事件传递机制
- 触摸事件的类型(MotionEvent(ACTION_DOWN,ACTION_MOVE,ACTION_UP等))
- 触摸事件的三个阶段(分发-拦截-消费)
- view的时间传递机制(activity->view)
- viewgroup的时间传递机制 (activity->viewgroup->view)
2. Android View的绘制流程
- Android UI管理系统的层级关系(activity-phonewindow-decorview-(titleview,contentview))
- 绘制的整个流程(performtraversals->performMeasure->performLayout->performDraw)
- MesureSpec(unspecified,at_most(wrap_content),exactly(match_parent))
- Measure
- layout
- draw(drawBackground-saveLayer-onDraw-dispatchDraw-restoreToCount-onDrawScrollBar)
3. Android动画
- 帧动画(xml方式/动画方式添加)
- 补间动画(alpha/rotate/scale/translate,添加方式)
- 属性动画(Evaluator,animatorset,valueanimator,objectanimator)
过渡动画(transition)(本质是属性动画,但是对属性动画做了封装,方便实现过度动画的效果。需要动画前后两个布局)(定义transition的步骤:1. 定义动画前后两个布局 2. 根据布局文件创建布局前后的scene 3. 创建过度动画transitionset 4. 调用TransitionManager.go(scene, transitionSet))
- scene(定义页面信息)
- transition(changebounds,fade,transitionset,autotransition)
- transitionmanager(切换控制器)
4. Support Annotation Library
- 基础概念(support library,support annotion library)
- Nullness注解(@NonNull,@Nullable)
- 资源文件类型注解(@AnimatorRes,@AnimRes,@AnyRes,@ArrayRes,@AttrRes,@BoolRes,@ColorRes,@DrawableRes,@FractionRes,@IdRes,@IntegerRes,@InterpolatorRes,@LayoutRes,@MenuRes,@PluralsRes,@RawRes,@StringRes,@StyleableRes,@StyleRes,@TransitionRes,@XmlRes)
- 权限注解(@RequiresPermission)
- 类型定义注解(@IntDef @interface @Retention,定义注解类)
- 线程注解(@MainThread,@UiThread, @WorkThread,@BinderThread)
- 颜色值注解(@ColorInt)
- 值范围注解(@Size(n),@Size(max=m),@Size(min=n),@Size(Multiple=2),@IntRange(from=0,to=255),@FloatRange(from=0.0,to=1.0))
- 重写函数注解(@CallSuper)
- 返回值注解(@CheckResult)
- keep注解(@keep)
- visibletest注解(@VisibleTest)
- lint的用法(Analyze->Inspect Code->选择范围)
5. Percent Support Library(百分比布局)
- PercentRelativeLayout
- PercentFramelayout
- layout_heightPercent/layout_widthPercent
- aspectRatio
6. Design Support Library
- 简介,snackbar,navigationview,floatingactionbutton,coordinatorlayout,constraintlayout,collapsingtoolbarlayout
- snackbar(setAction)
- textinputlayout(用法设置为edittext的父布局)
- tablayout
navigationview
5.1 导航菜单
5.2 导航头部FloatingActionButton
6.1 基本属性(elevation(未按压状态的阴影),pressedTranslationZ(按压状态的阴影))
6.2 其它选项(backgroundTint(背景颜色),rippleColor(波纹颜色),fabSize(可选尺寸))CoordinatorLayout(协调布局,可以使不同布局的组件之间直接相互作用,并且协调动画效果)(例如,floatingactionbar和snackbar,点击floatingactionbutton出现snackbar,然后floatingactionbutton自动往上移动,snackbar消失时,floatingactionbutton自动往下移动,这里就需要将coordinatorlayout作为floatingactionbutton的父容器)
- CollapsingToolbarLayout(可以实现当屏幕内容滚动时,toolbar收缩的效果,通常和appbar配合使用)
- BottomSheetBehavior(1. 布局中添加app:layout_behavior属性,并将这个view作为coordinatorlayout的子view 2. 布局文件中创建bottomsheetbehavior对象,并设置状态变化的监听)
7. NDK开发
- ABI(应用程序二进制接口application binary interface)(arm-v5,arm-v7,arm-v8,x86,x86_64,mips,mips6)
- 引入预编译的二进制文件
- 自己写c/c++文件
- 使用.so文件的注意事项
8. Gradle必知必会
- 概念(是Android studio标配的构建系统,settings.gradle,project build.gradle,module build.gradle,gradle的文件结构)
- 共享变量(1. 在项目路径下创建xxx.gradle文件 2. 在文件中定义变量如project.ext{javaVersion = 1.8} 3. 在module build.gradle中apply from: “${project.rootDir}/xxx.gradle”,然后引用变量名就可以)
- 通用配置(在project build.gradle下创建subprojects{}定义配置)
- 如何引用aar(1. 指定aar文件的位置,在module build.gradle中的android节点下创建repositories{flatDir{dirs ‘libs’}} 2. 在dependencies节点下添加compile(name: ‘xxx’, ext: ‘aar’))
- 签名混淆的配置
9. gradle打包发布
- maven central
- jcenter
- jitpack
10. Builder建造者模式详解
- 经典的建造者模式(java设计模式之建造者模式)
- 建造者模式的变种
- 变种的自动化生成
- 使用builder模式的开源例子
11. 注解在Android中的使用
- 注解的定义(java语言的特性之一,他是在源代码中插入的标签,在之后的编译和运行中起到某种作用,每个注解都必须通过@interface进行声明,接口的方法对应着注解的元素)
标准注解(java包中默认给出的注解)
2.1 编译相关的注解(@override,@deprecated,@suppresswarnings,@safevarargs,@generated,@functuinalinterface)
2.2 资源相关的注解(javaee中用到)(@PostConstruct,@PreDestroy,@Resource,@resources)
2.3 元注解(用来定义和实现注解的注解)
2.3.1 @Target(指定注解所适用的对象的范围) 2.3.2 @Retention(用来指明注解的访问范围,也就是在什么级别保留注解)(源码级注解(@Retention(RetentionPolicy.SOURCE)),编译级注解(@Retention(RetentionPolicy.CLASS)),运行时注解(@Retention(RetentionPolicy.RUNTIME))) 2.3.3 @Documented(表示被修饰的注解应该保存在被注解项的文档中) 2.3.4 @Inherited(表示该注解可以被子类继承) 2.3.5 @Repeatable(表示这个注解可以在注解项上应用多次)运行时注解(该注解会被保存在.class和.java文件中,在执行时,也保留注解信息。可以通过反射机制读取注解的信息)
- 编译时注解
12. ANR产生的原因及定位分析
ANR产生的原因
只有当UI线程响应超时才会引起ANR,主要两种原因导致超时,1. 事件被阻塞,正在处理其它阻塞事件 2. 自身处理事件耗时太长。
activity/view 5s, broadcast 10s, Service 20s经典场景
- 应用程序UI线程中存在耗时操作,例如在UI线程中进行网络操作,数据库操作和文件操作等,导致ui线程阻塞无法响应用户数据等。
- 应用程序的ui线程在等待工作线程释放某个锁,从而无法处理事件
- 耗时的动画需要大量的计算工作,可能导致CPU负荷过重
定位和分析
- logcat分析可以看到是anr发生的进程及包名和类名,pid,reason,cpu使用情况
- 如果还是没有具体定位到anr发生的位置,就需要借助/data/anr/xxx.txt文件。文件包括发生anr的进程名,id和时间,cpu架构,堆内存的使用情况,线程信息,以及anr发生的位置及错误信息。
- 避免和检测
不要在主线程做耗时操作,使用检测工具检测存在违规操作的工具类
13. Android异步处理技术
常见的异步处理技术:Thread,AsyncTask,Handler & Looper, Executors。
Handler异步处理消息机制:
- Looper.prepare方法会在本线程中创建一个Looper实例,在实例化过程中会创建一个MessageQueue,这个looper实例会被保存到ThreadLocal对象中(ThreadLocal对像可以再线程中存储变量)
- Looper.loop方法会让当前线程进入一个无限循环,不断的从Messagequeue中得到message对象,并且通过msg.target.dispatchMessage将消息发送出去
- Handler的构造方法会获取当前线程中保存的looper实例,并与looper对象的messagequeue关联起来
- handler.sendmessage中将msg.tar设置为handler对象本身,并将message添加到messagequue中
- msg.target.dispatchmessage即是handler.dispatchmessage,他会回调handler.message方法
1. Thread
概念: 执行任务的基本单元
2种创建方式: 继承Thread,实现runnable
3种线程的分类:
- 主线程(ui线程),随着应用启动而启动,用来运行Android组件,刷新组件元素。通过handle顺序处理其它线程发来的消息。
- binder线程,Binder线程用于不同进程之间的通信,每个应用在创建之后,就创建了一个线程池,用于处理其它进程的线程发送的消息,经典场景是aidl
- 后台线程(工作线程)
2. HandlerThread
HandlerTread是Thread的子类,它内部集成了Looper和MessageQueue。内部其实也是handler机制。
3. AsyncQueryHandler
主要用于contentprovider中的异步数据查询,不常用
4. AsyncTask
asynctask task = new asynctask(){
onpreexecute();
onpostexecute();
doinbackground();
onprogressupdate();
};
task.execute();
构造方法中创建mHandler,mWork,mFuture->execute()->executeOnExecutor() 1. onpreexecute() 2. exec.execute()->exec.execute() exec对象是在execute方法中的参数,是sdefaultexecutor成员变量实际上是一个SerialExecutor类的实例->创建serialexecutor对象会首先生成arraydeque队列,将mfuture对象封装成runnable添加到队列中,判断mactive是否为空,如果为空执行scheduleNext()->这个方法会先去将队列的队尾赋值为mactive,然后执行THREAD_POOL_EXECUTOR.execute(mactive)方法->实际上THREAD_POOL_EXECUTOR是一个线程池,相当于执行线程的run方法->mactive对象实际上是mFuture,FutureTask.run实际上会执行callable.call()->mWork.call() 1. 执行doinbackground 2. 执行postresult->postresult 1. 封装result为message,message 2. 调用message.senttotarget发送。实际上是调用handle处理消息->mhandler对象handlemessage,两种事件 1. PostResult 回调onCancel,onPostExecute 2. PostProgress 回调onProgressUpdate
5. Loader
不常用