



只有异常情况下系统才会自动调用onSaveInstanceState (Bundle bundle)通过bundle存储数据,回复数据可通过onCreate和onRestoreInstanceState这两个方法恢复,区别在于onRestoreInstanceState中的bundle一定不为空,而onCreate方法中的bundle可以为空,要做非空判断,建议使用onRestoreInstanceState。








taskAffinity任务相关性
注意:只有onNewIntent所属的activity(singleTask启动模式)已经创建才会执行onNewIntent









绑定服务是依托于activity,启动服务依靠自己的service和内存的一些情况



数据传递用parcelable
数据存储用serializable











Message:handler接受和处理消息的对象;
Looper:每一个线程只能有一个Looper,是线程持有,内部有一个方法可读取MessageQueue消息队列中的消息,消息取出交给Handler;
MessageQueue:消息队列,先进先出的方式管理Message,创建Looper的时候,在Looper的构造方法中会创建MessageQueen对象,是单链表数据结构;
Handler:发送消息,处理消息;




默认情况下AsyncTask是串行的!
AsyncTask是个抽象类
核心线程数:cpu核数+1
最大线程数:cpu核数*2 + 1
ThreadFactory是用来创建线程池的
blockingqueue 阻塞队列:容量128
AsyncTask内部有一个静态的线程池
SerialExecutor.execute串行的执行mTasks队列中的runnable
schedduleNext最终还是使用Thread_pool_executor来执行线程操作
InternalHandler绑定了主线程的handler,子线程以此来更新UI
Java并发编程:Runnable 、Callable
Runnable的run()方法无返回值;Callable<V> 的 V call()方法是有一个V泛型的返回值
WorkerRunnable implements Callable
FutureTask -- get<该方法会等待Callable的call方法返回值,否则就会阻塞等待> /cancel /done


getrootMeasureSpec 获取宽高
通过MesasureSpecMode 获取模式
通过MesasuerSize获取大小
performMesasuer 进行测量
onMeasure获取父view对子view测量的宽高
setmeasureDimension进行设置



easuse 测量子view的宽高 ,layout测量子view相对父类的布局,ondraw绘制出来





使用Asynctask处理耗时io操作
使用Thread或者handlerThread 提高优先级,都能开启一个线程,后者handlerThread可以在子线程中创建handler发送消息,因为它内部创建了Looper 关联了消息队列,所以后者可以创建handler。
使用handler来处理工作线程的耗时任务
activity的oncreate和onResume回调中尽量避免耗时的代码


避免oom
一、bitmap优化
1.图片显示-加载何时储存的图片,例如listview监听滑动事件,在滑动的时候不去调用网络请求,滑动停止加载大图。
2.及时释放内存---释放c区
3.图片压缩---insampsize()缩放比例
4.inBitmap--可以bitmap分配和释放的效率,告诉decode解码器,使用已有的内存区域
5.捕获异常---实例化bitmap一定要对outfomemery(oom) error进行捕获。
二、


LRU--存储bitmap,三级缓存。
实现机制:内存使用LinkedHashMap,提供了get(),put()方法来完成缓存的添加和获取操作。缓存满之后,提供trimToSize()方法,把较早缓存对象移除,添加新的缓存对象





布局优化
1.使用include,merge标签
2.尽量不存在冗余嵌套,复杂布局
3.使用gone替代invisible
4.使用weight
5.item存在非常复杂的嵌套时,建议使用自定义view
列表及Adapter优化
1.复用getview,不重复使用获取实例使用convertview
2.列表滑动不进行元素的更新。
背景和图片等内存分配优化
1.减少背景设置
2.图片压缩处理



handler造成内存泄漏的原因,是其与主线程context的生命周期不一致导致,具体主要包括:
- 使用了postDelayed()、sendMessageDelayed()等方法,导致在delay时间到达前出现MessageQueue -> Message -> Handler -> Activity的引用链;
- 在handler被耗时线程回调前,耗时线程会一直持有该handler对象(直接持有,或通过持有其obtain的message的对象的target持有)
image.png
image.png
image.png
image.png
image.png
特点:冷启动会先创建和启动application类,再创建和初始化MainActivity类,测量,布局,绘制,显示再界面上;热启动不需要创建Application类,只创建初始化MainActivity就够啦
image.png
image.png
image.png
image.png
其他优化
image.png
StrictMode,追踪UI卡顿的工具
image.png
image.png
image.png
image.png
①.Serializeble (Java)
该接口序列化的时候会引起大量临时变量—>频繁GC回收、内存 抖动—>UI卡顿—>严重则OOM
②. parcelable(Android特有的序列化方式)
缺点:Parcelable 不能使用在要将数据存储在磁盘上的情况
优点:在内存使用上性能更好,使用场合Android中的进程间通信传递信息
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
网友评论