目录
-
- [0 前言](#0 前言)
- [1 Activity的生命周期和启动模式](#1 Activity的生命周期和启动模式)
- [2 IPC](#2 IPC)
-
- [2.1 多进程带来的问题](#2.1 多进程带来的问题)
- [2.2 多进程方式](#2.2 多进程方式)
- [2.3 序列化](#2.3 序列化)
- [2.4 其他](#2.4 其他)
- [3 View的事件体系](#3 View的事件体系)
-
- [3.1 基础知识](#3.1 基础知识)
- [3.2 View的滑动](#3.2 View的滑动)
- [3.3 事件分发](#3.3 事件分发)
- [3.4 滑动冲突](#3.4 滑动冲突)
- [4 View的工作原理](#4 View的工作原理)
- [5 理解RemoteViews](#5 理解RemoteViews)
-
- [5.1 PendingIntent](#5.1 PendingIntent)
- [6 Android的Drawable](#6 Android的Drawable)
- [7 Android动画](#7 Android动画)
- [8 理解Windows和WindowManager](#8 理解Windows和WindowManager)
- [9 四大组件的工作过程](#9 四大组件的工作过程)
- [10 Android消息机制](#10 Android消息机制)
- [11 Android中线程和线程池](#11 Android中线程和线程池)
- [12 Bitmap的加载和缓存](#12 Bitmap的加载和缓存)
- [13 综合技术](#13 综合技术)
- [14 JNI和NDK编程](#14 JNI和NDK编程)
- [15 性能优化](#15 性能优化)
0 前言
简单的记录。
1 Activity的生命周期和启动模式
2 IPC
- binder
内存映射、1MB - socket
更倾向于不同设备、跨网络进程之间通信
Android每个应用会分配一个uid
2.1 多进程带来的问题
1)静态成员和单例模式失效
2)线程同步机制失效
3)sp不安全
4)application多次创建
2.2 多进程方式
intent、共享文件、持久化存储
binder相关AIDL、Messenger、ContentProvider
socket
2.3 序列化
使用intent、binder、网络请求、磁盘等需要让对象序列化
Parcelable
Serializable
2.4 其他
intent 支持传递bundle数据
bundle实现了Parcelable ( ArrayMap)
3 View的事件体系
3.1 基础知识
- 四个顶点 相对父容器 top bottom left right 左上角 右下角顶点
- translationX translationY View左上角相对于父容器偏移量
- MotionEvent:move down up cancel等
事件中获取触碰的坐标
getX/getY :相对于当前View
getRawX/getRawY: 相对于屏幕
TouchSlop:系统认为滑动的最小距离
VelocityTracker:手指滑动中的速度,滑动像素/时间
GestureDector:手势检测,单击、滑动、长按、双击等
Scroller:弹性滑动
3.2 View的滑动
1.scrollTo/scrollBy
滑动内容不能滑动View本身
2.动画
操作translationX translationY
View动画一样不能滑动View本身
属性动画Android3.0以上可以
3.改变布局参数LayoutParams
弹性滑动,渐进式滑动
把一次滑动分为若干小滑动,并在一个时间段完成
handler延时、sleep、scroller等等
3.3 事件分发
系统需要把一个MotionEvent传给一个具体的View
dispatchTouchEvent:用于分发事件,受当前View的onTouchEvent和子元素View的dispatchTouchEvent影响
onInterceptTouchEvent:在分发事件的内部,表示是否拦截
onTouchEvent:是否消耗事件
对一个根ViewGroup:
1.点击事件发生后,会传递给它,然后调用分发方法,如果拦截方法返回true,事件会给这个ViewGroup处理,接着调用它的处理方法
2.如果拦截返回false,就给它的子元素,然后子元素的分发方法会调用,直到被处理
传递优先级
onTouchListener > onTouchEvent > onClickListener
viewGroup默认不拦截
view默认处理返回true
view一旦拦截一个事件序列,所有事件都由他处理
Activity -> PhoneWindow -> DecorView(setContentView设置的View的父容器)
setContentView设置的View可以称为顶级View(根View)
3.4 滑动冲突
类型:
滑动方向不一致、一致、两者的嵌套
1的基本思路是根据滑动方向来选择事件给谁
滑动方向的判断有多种,可以用与水平方向夹角,获取水平高度、垂直高度的距离差等
一致的话需要根据具体的需求来看
嵌套同上
外部拦截法:
点击事件先经过父容器拦截,需要就拦截,反之不拦截
(主要是move事件),down不能拦截,拦截的话move、up不能传给子元素
内部拦截法:
让子元素判断
优先外部拦截法,好理解
4 View的工作原理
ViewRoot,View绘制三大流程都是由它完成
Activity被创建完,会将DecorView加到Window中;同时创建ViewRootImpl对象,和DecorView进行关联
MeasureSpec 测量规格
32位,前2位测量模式,后30位测量大小
测量模式:
三种
EXACTLY:父容器已经检测出View需要的精确大小,对应match_partent
AT_MOST:父容器指定了一个大小,不能大于这个值,对应wrap_parent
另一个父容器不对View进行限制
LayoutParams需要和父容器一起决定View的MeasureSpec
普通的View,MeasureSpec由父容器的MeasureSpec和自身的LayoutParams决定
自定义View
1.继承View实现onDraw方法
2.继承系统的View,如TextView
3.继承系统的ViewGroup,如LinearLayout
4.继承自定义的ViewGroup,看起来就像几个View组合在一起
注意:
1.直接继承View或ViewGruop,如上面的1,需要自己支持wrap_parent、padding
2.View内部由View.post,尽量不要用handler
3.View中如果有线程或动画,需要及时停止
4.如果有滑动冲突,处理好
5 理解RemoteViews
可以在其他进程显示,用于通知栏和桌面小部件,通过binder传到SystemServer进程;不支持自定义View
5.1 PendingIntent
它是一种挂起的intent,操作不是当前执行,通过用于间接的 Intent 跳转需求 。
常见的应用是广播通知后的点击事件,系统显示通知时,并没有执行,而是点击后,系统通知这个应用间接执行 PendingIntent#send() ,而不是通过当前应用执行。
给Remote设置单击事件
支持启动Activity、Service、发送广播
相同匹配规则:
两个PendingIntent内部intent相同和requestCode相同
intent的话,ComponentName和intent-filter匹配
6 Android的Drawable
表示图像,BitMapDrawable、ShapeDrawable、LayerDrawable等
7 Android动画
View动画、帧动画、属性动画
8 理解Windows和WindowManager
Window的具体实现在WMS中
WindowManager常用功能,添加View、更新View、删除View
Window和View通过View RootImpl建立联系
9 四大组件的工作过程
Android中Service学习记录
Android中广播接收器BroadcastReceiver学习
Android中ContentProvider学习记录
10 Android消息机制
Looper无限循环查找消息队列是否有消息,有则处理;没有则等待,不占用cpu
MessageQueue的next返回null的时候loop方法退出死循环,loop阻塞
不允许子线程更新ui,若加锁会过度复杂
ThreadLocal
11 Android中线程和线程池
HandlerThread
一个带有handler的线程,有消息队列,具体例子IntentService
IntentService
优先级高、执行完任务自动停止
线程池:
1.避免频繁创建、销毁的开销
2.控制最大并发数,
工作流程:
1)任务进来,先判断当前线程是否大于核心线程数,没有的话启动一个核心线程来执行任务;
2)已经超过,加入任务队列排队;
3)任务队列满了,变为最大线程数
4)线程数到了最大线程数,执行拒绝策略
12 Bitmap的加载和缓存
常用BitMap缓存LRU、DiskLruCache
缓存的增加、获取、删除
一个图片加载器需要
图片同步加载、异步加载、缓存、压缩、网络拉取,防止OOM
13 综合技术
crash
给程序设置CrashHandler,crash信息上传到服务器
动态加载-插件化
热插拔-不发新版更新某些模块
打包
14 JNI和NDK编程
NDK:让Android更方便地通过JNI来访问本地代码
15 性能优化
布局优化,include标签
绘制优化,onDraw不要做耗时任务,以及新建局部对象
内存泄漏,静态变量、单例、hanlder、资源没有及时销毁
ANR,一个进程发生了ANR,通过data/anr/trace.txt定位原因