Android开发艺术探索

Android开发艺术探索
1 Activity的生命周期和启动模式

典型情况下生命周期
异常情况下生命周期

启动模式
标准模式
栈顶复用模式
栈内复用模式
单实例模式

Activity的Flags
IntentFilter的匹配规则

2 IPC机制

进程间通信

Serializanle
Parcelable
Binder


3 View的事件体系

事件分发机制

事件分发机制
点击事件就是MotionEvent 事件分发其实就是对MotionEvent事件的分发
三大方法
dispatchTouchEvent 分发
onInterceptTouchEvent 拦截
onTouchEvent 消费
事件传递顺序 Activity Window View
对于ViewGroup 点击事件产生后 就会调用dispatchTouchEvent 然后调用onInterceptTouchEvent
如果返回true 表示要拦截该事件 就会调用onTouchEvent
如果返回false 表示不看就 则该事件就会传递到其子元素中

4 View的工作原理

View的工作流程

onMeasure 为整个View树计算实际的大小 设置实际的宽高
每个View控件的实际宽高由父视图和本身视图决定
onLayout 根据子视图大小布局参数 将View放到合适的位置上
onDraw 绘制图像 首先绘制背景 再调用onDraw绘制视图本身 如果View是ViewGroup
调用dispatch绘制子视图 最后绘制滚动条

自定义View

继承View重写onDraw 用于实现一些不规则的效果
继承ViewGroup派生特殊的Layout 用于实现自定义布局

5 RemoteViews
6 Drawable
7 Android动画

View动画 通过对场景里的对象做图像变换 平移 缩放 旋转 透明度从而产生动画效果
帧动画 通过顺序播放一系列图像从而产生动画效果
属性动画 API11 动态的改变对象的属性产生动画效果

8 Window WindowManager
9 四大组件工作机制
10 Android的消息机制

Handler机制
Handler通过调用sendMessage把消息放在消息队列MessageQueue中
Looper负责把消息从消息队列中取出来 重新再交给Handler进行处理
11 线程和线程池

AsyncTask
封装了线程池和Handler 方便在子线程中更新UI

HandlerThread
具有消息循环的线程 内部使用Handler
实现方式是run中通过Looper.prepare来创建消息队列 并通过Looper.loop来开启消息循环

IntentService
特殊的Service 封装了HandlerThread和Handler 用于执行后天耗时的任务 任务执行后自动停止

ThreadPoolExecuter 线程池
重用线程池中线程 避免因为线程的创建销毁带来的性能开销
有效控制线程池最大并发数 避免线程之间抢占资源导致的阻塞
能够对线程进行简单管理

构造方法参数
corePoolSize 核心线程数
maxmunPoolSize 最大线程数
keepAliveTime 超时时长
unit 时间单位
workQueue 任务队列
threadFactory 线程工厂

四类线程池
FixedThreadPool
CachedThreadPool
ScheuledThreadPool
SingleThreadPool

12 Bitmap的加载和Cache

Bitmap加载和缓存

LruCache 内存缓存
内部采用LinkedHashMap以强引用方式存储外界缓存对象
强引用 直接的对象引用
软引用 系统内存不足时该对象被gc回收
弱引用 此对象随时会被gc回收

DiskLruCache 硬盘缓存

13 综合技术

CrashHandler

multidex解决方法数越界

动态加载技术
资源访问
Activity生命周期管理
ClassLoader管理

反编译初步

14 JNI和NDK

JNI Java本地接口 方便Java调用C C++等本地代码所封装的一层接口
NDK Android所提供的一个工具集合 通过NDK可以在Android中更加方便
的通过JNI来访问本地代码

JNI的开发流程
在Java中声明native方法
编译Java源文件得到class文件 然后通过javah导出JNI的头文件
实现JNI方法
编译so库并在Java中调用

NDK开发流程
下载并配置NDK
创建一个Android项目并声明所需的native方法 java文件 System.loadLibrary
实现Android项目所声明的native方法 test.cpp Android.mk Application.mk
通过ndk-build命令编译产生so库

JNI的数据类型和类型签名
JNI调用Java方法的流程

15 Android性能优化

性能优化
布局优化
删除布局中无用的控件和层级 选择性能较低的ViewGroup 避免过度绘制
include标签 重用指定的布局文件
merge标签和include标签一起使用减少布局层级
ViewStub 按需加载所需的布局文件

绘制优化
View的onDraw避免执行大量的操作 
不要创建新的局部对象 不要做耗时任务

内存泄漏优化
静态变量导致的内存泄漏
单例模式导致
属性动画无限循环
补充
资源对象没有关闭 如查询数据库没有关闭游标
构造Adapter没有使用convertView
Bitmap在不使用时未调用recycle释放内存
Context逃逸
注册没有取消 如动态注册广播在Activity销毁没有反注册
集合对象未清理
Activity中使用非静态内部类 并开启一个长时运行的线程
由于内部类持有Activity引用 导致Activity无法回收
Handler内存泄漏
类的静态变量持有大数据对象
非静态内部类存在静态实例

响应速度优化 避免在主线程中做耗时操作
ANR
Activity 5秒内无法响应输入操作
BroadcastReceiver 10m秒内还未执行完操作
Servcice 20秒内未完成相关处理
定位 开发机器上查看traces.txt日志
避免 使用子线程处理耗时IO操作
解决办法
Java多线程
AsyncTask
Handler机制
HandlerThread
IntentService

ListView优化
采用ViewHolder并避免在getView中执行耗时操作
根据列表的滑动状态来控制任务的执行频率
开启硬件加速使ListView滑动更流程

Bitmap优化
通过BitmapFactory.Options来根据需要对图片进行采样
配置inSampleSize参数

线程优化
采用线程池

MAT 内存泄露分析工具

提供程序可维护性

时间: 2024-10-14 14:37:01

Android开发艺术探索的相关文章

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

Android开发艺术探索——第二章:IPC机制(上)

Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化机制和Binder,然后详细的介绍Bundle,文件共享,AIDL,Messenger,ContentProvider和Socker等进程间通讯的方法,为了更好的使用AIDL进行进程间通讯,本章引入了Binder连接池的概念,最后,本章讲解各种进程间通信方式的优缺点和使用场景,通过本章,可以让读者对

【读书笔记】【Android 开发艺术探索】第4章 View 的工作原理

一.基础知识 1.ViewRoot 和 DecorView ViewRoot 对应 ViewRootImpl 类,它是连接 WindowManager 和 DecorView 的纽带,View 的三大流程都是通过 ViewRoot 来完成的.在ActivityThread 中,当 Activity 对象被创建完毕后,会将 DecorView 添加到 Window 中,同时会创建 ViewRoot 对象. DecorView 添加到窗口 Window 的过程. 图片来自https://yq.ali

Android开发艺术探索读书笔记——进程间通信

1. 多进程使用场景 1) 应用某些模块因为特殊需求需要运行在单独进程中.如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会因为应用程序进程crash而受影响. 2) 为加大一个应用可使用的内存,需要多进程来获取多份内存空间. 2. 如何开启多进程 给四大组件(Activity.Service.Receiver.ContentProvider)在AndroidMainfest中指定android:process属性指定. 如果进程以":"开头的进程,代表应用的私有进程,其

Android开发艺术探索——第一章:Activity的生命周期和启动模式

Android开发艺术探索--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity中文翻译过来就是"活动"的意思,但是主席觉得这样翻译有些生硬,直接翻译成"界面"可能更好,的确,Activity主要也是用于UI效

Android开发艺术探索——第二章:IPC机制(中)

Android开发艺术探索--第二章:IPC机制(中) 好的,我们继续来了解IPC机制,在上篇我们可能就是把理论的知识写完了,然后现在基本上是可以实战了. 一.Android中的IPC方式 本节我们开始详细的分析各中跨进程的方式,具体方式有很多,比如可以通过在Intent中附加extras来传递消息,或者通过共享文件的方式来共享数据,还可以采用Binder方式来跨进程通信,另外,ContentProvider天生就是支持扩进程访问的,所以通过Socket也可以实现IPC,上述的各种方法都能实现I

Android 开发艺术探索——第十章 Android的消息机制

Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机制,Handler的运行需要底层的MessageQueue和Looper的支撑. MessageQueue即为消息队列,顾名思义,它的内部存储了一组消息,以队列的的形式对外提供插入和删除的工作.虽然叫队列,但内部存储结构并不是真正的队列,而是采用单链表的数据结构来存储消息列表. Looper意思为循

Android开发艺术探索(研读笔记)——03-Android中的IPC机制(一)

Android开发艺术探索(研读笔记) 作者:Dimon 微博:@Dimon-喰 GitHub:@Dimon94 LOFTER:@Dimon. 03-Android中的IPC机制(一) 1.Android IPC 简介 IPC(Inter-Process-Communication):含义为进程间通信,指两个进程之间进行数据交换的过程. 什么是进程:一般指一个执行单元,在PC和移动设备上的一个程序或者一个应用. 什么是线程:线程是CPU调度的最小单元,是一种有限的系统资源. 而一个进程可以包含多

Android开发艺术探索——第四章View的工作原理

Android开发艺术探索--第四章View的工作原理 4.1 (一)初识ViewToot和DecorView 基本概念 ViewRoot对应于ViewRootImpl类,是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成的.在ActivityThread中,当Activity对象被创建完成后,会将DecorView添加到View中.同时,会创建ViewRootImpl对象,并将ViewTootImpl对象和DecorView建立关联.