Android知识点整理(一)
《Android高级进阶》学习笔记
第1篇 基础篇
第1章:Android触摸事件传递机制
1.1 触摸事件的类型
- ACTION_DOWN
- ACTION_MOVE
- ACTION_UP
1.2 事件传递的三个阶段
- 分发(dispatch):
dispatchTouchEvent
- 拦截(intercept):
onInterceptEvent
- 消费(consume):
onTouchEvent
有事件处理能力的三个类:
- Activity:有
dispatchTouchEvent
和onTouchEvent
方法 - ViewGroup:有
dispatchTouchEvent
、onInterceptEvent
和onTouchEvent
方法 - View:有
dispatchTouchEvent
和onTouchEvent
方法
第2章:Android View的绘制流程
2.1 绘制的整体流程
从根视图(ViewRoot)的performTraversals()
方法开始,从上到下遍历整个视图树。
视图绘制分为三个步骤:
- 测量(Measure)
- 布局(Layout)
- 绘制(Draw)
第3章:Android动画机制
3.1 逐帧动画(Frame Animation/Drawable Animation)
利用人眼的视觉暂留效应,对于一系列图片,指定动画中每一帧对应的图片和持续时间。
3.2 补间动画(Tween Animation)
只需要定义动画的开始和结束两个关键帧,并指定动画变化的时间和方式等,Android系统通过在两个关键帧之间插入渐变值来实现平滑过渡。
包括四种基本效果:
- 透明度变化:Alpha
- 大小变化:Scale
- 位移变化:Translate
- 旋转变化:Rotate
还可以把这四周效果组合(Set)
3.3 属性动画(Property Animation)
在Android 3.0中引入,相当于增强版的补间动画。
3.4 过渡动画(Transition Animation)
在Android 4.4中引入,本质上还是属性动画。
第4章:Support Annotation Library使用详解
Support Annotation Library是从Android Support Library 19.1开始引入的一个全新的函数包,它包含一系列有用的元注解,用来帮助开发者在编译期间发现可能存在的bug。
第5章:Percent Support Library使用详解
2015年8月,Google发布了一个全新的百分比布局兼容函数库:Android Percent Support Library,可以解决手机屏幕碎片化的问题。目前支持RelativeLayout和FrameLayout,GitHub上有对LinearLayout百分比布局的开源代码。
第6章:Design Support Library使用详解
Design Support Library是在Google I/O 2015上发布的一个全新兼容函数库,使开发者可以在Android 2.1(API Level 7)及以上的设备中实现Material Design的效果。
这个库提供了一系列控件:Snackbar、Navigation View、FloatActionButton、CoordinateLayout、CollapsingToolbarLayout等。
第7章:Android Studio中的NDK开发
ABI,Application Binary Interface,应用程序二进制接口,它定义了二进制文件(Android平台上专指.so文件)如何运行在相应的系统平台上。
目前Android平台支持7种不同的CPU架构,每个CPU架构对应一个ABI。
在Android Studio中为工程添加C/C++代码的两种方法:
引入预编译的二进制C/C++函数库
直接从C/C++源码编译
第8章:Gradle必知必会
AAR(Adnroid Archive)是在Android Studio中开始引入的一个全新的文件类型,它本质上是一个压缩包,里面包含了jar文件和Android相关的资源。
第9章:通过Gradle打包发布函数库到JCenter和Maven Central
Maven是Java开发中流行的构建工具,它的好处之一是可以减少构建应用程序时所依赖的软件构建的副本,Maven建议的方式是将所有软件构建存储在一个叫做Repository的远程仓库中。
目前有两个标准的Java & Android Maven仓库:Maven Central和JCenter。
早起的Android Studio版本使用Android Maven作为默认的Maven仓库,现已改为JCenter。
第10章:Builder模式详解
参考这篇文章:使用Builder解决构造函数参数过多的问题
第11章:注解在Android中的应用
注解是Java语言的特性之一,它是在源代码中插入的标签,这些标签在后面的编译或者运行过程中起到某种作用,每个注解都必须通过注解接口@interface
进行声明,接口的方法对应着注解的元素。
1、标准注解
编译相关注解:
@override
、@Deprecated
、@SuppressWarnnings
、@SafeVarargs
、@Generated
、@FunctionalInterface
资源相关注解:
@PostConstruct
、@PreDestroy
、@Resource
、@Resources
元注解:
@Target
、@Retention
、@Documented
、@Inherited
、@Repeatable
2、编译时注解
3、运行时注解
第12章:AND产生的原因及其定位分析
ANR(Android Not Responding,应用程序无响应)是Android中一个独有的概念。
1、引起ANR的原因
引起ANR的原因只有一种:应用程序的UI线程响应超时,而超时的原因一般有两种:
当前的事件没有机会得到处理,例如UI线程正在相应另外一个事件,当前的事件由于某种原因被阻塞了。
当前的事件正在被处理,但是由于耗时太长没能及时完成。
2、ANR产生的根源及超时时间
KeyDispatchTimeout
:最常见的一种类型,原因是View的OnClick()
事件或OnTouch()
事件在特定的时间(5秒)内无法得到相应。BroadcastTimeout
:原因是BroadcastReceiver的OnReceiver()
方法运行在主线程中,在特定的时间(10秒)内无法完成处理。ServiceTimeout
:比较少出现的一种类型,原因是Service的各个生命周期函数在特定的时间(20秒)内无法完成处理。
第13章:Android异步处理
Android中的异步处理技术继承树:
1、Thread
Android应用中各种类型的线程本质上都基于Linux系统的pthreads,在应用层可以分为三种类型的线程:
主线程:即UI线程,随着应用程序的启动而启动。主线程用来运行Android组件,同时刷新屏幕上的UI元素。只有主线程才能操作UI,是因为Android的UI工具包不是线程安全的。主线程中穿件的Handler会顺序执行接收到的消息,包括从其他线程发送的消息。
Binder线程:用于不同进程之间的线程的通信,每个进程都维护了一个线程池,用来处理其他进程中线程发送的消息。在大部分情况下,应用不需要关心Binder线程,因为系统会优先将请求转换为使用主线程。
后台线程:在应用中显示创建的线程都是后台线程。在Linux系统层面,主线程和后台线程都是一样的。在Android框架中,通过WindowManager赋予了主线程只能处理UI更新以及后台线程不能直接操作UI的限制。
第14章:Android数据序列化方案研究
序列化是将数据结构或者对象转换成可用于存储或者传输的数据格式的过程,在序列化期间,数据结构或者对象将其状态信息写入到临时或者持久性存储区中。
1、Serializable
Serializable是Java语言的特性,它是最简单的也是使用最广泛的序列化方案之一。它的缺点是使用反射机制,在序列化的过程中会创建很多临时对象,容易触发垃圾回收,序列化的过程较慢,对于性能要求很严格的场景不建议使用这种方案。
Serializable是JDK提供的接口,其序列化方式是基于磁盘或者网络的。
对象的序列化是基于字节的,因此不能使用Reader和Writer这种基于字符的方式。
2、Parcelable
Parcelable是Android SDK提供的接口,其序列化方式是基于内存的。由于内存读写速度高于磁盘,因此在Android中跨进程对象的传递一般使用Parcelable。
3、SQLiteDatabase
SQLite是一款轻量级的关系型数据库,运算速度快、占用资源少(只需要几百KB内存),特别适合在移动设备上使用。Android和iOS都内置了SQLite数据库。
4、SharedPreferences
SharedPreferences是Android平台提供的一个轻量级的存储API,一般用来保存应用的一些常用配置信息,其本质是一个键值对存储。SharedPreferences相比其他序列化方法更高效。
5、JSON
JavaScript Object Notation,是一种轻量级的数据交换格式,几乎80%的APP与服务端的通信都是使用JSON格式。
6、Protoclo Buffers及Nano-Proto-Buffers
Protoclo Buffers是Google设计的语言无关、平台无关的一种轻便高效的序列化结构数据存储格式,类似XML,但更小、更快、更简单。在移动端代码中最好使用Nano-Proto-Buffers
版本。
7、FlatBuffers
FlatBuffers是Google为游戏开发或其他队性能敏感的应用程序创建的开源的、跨平台的、高效的序列化函数库,它提供了对C++/Java等语言接口的支持。FlatBuffers是一个注重性能和资源使用的序列化类库。相比较Protoclo Buffers而言,FlatBuffers更适合移动设备。
Android WebView Java和JavaScript交换详解
现在的移动应用几乎都是Hybrid方式,即集合了Native APP和Web APP的优点,既保证了用户体验,又使得APP在一定程度上具备动态更新的能力,同时有利于实现跨平台开发,减少人力成本。
Hybrid的关键在于实现Java和JavaScript之间的通信,即Java调用JavaScript,以及JavaScript调用Java。