activity的状态
Running->paused->stop->kill
- Running是当前Activity位于栈顶时开始调用
- paused是当前activity失去焦点以后调用的
- stop是当前activity不再显示以后,就是看不见以后调用
- kill是当前activity被后台系统回收以后
activity的生命周期
- activity启动以后-> onCreate - onStart - onResume
- 按Home键以后 -> onPause - onStop
- 再次返回activity以后 -> onRestart - onStart - onResume
- 退出当前activity以后 -> onPause -onStop - onDestroy
android进程优先级
前台进程 / 可见 / 服务 / 后台 / 空
- 前台进程就是正在与用户交互的进程,持有焦点
- 可见进程就是已经失去了焦点,但依然可见,比如activity里弹了一个对话框,那activity就会进入可见进程
- 服务进程 由名字就可以看到,是开启一个服务
- 后台进程 是比如当前activity按home键以后,将会进入后台
- 空进程 就是一个空进程,什么都没有了,随时有可能被杀掉
activity启动模式
- standard 默认模式 每次打开新的activity时,都会去new一个新的实例,进入任务栈,生命周期也会正常调用
- singletop 栈顶复用模式 当打开新的activity时,栈顶已经有当前activity的实例存在,会复用栈顶的, 调用onNewIntent方法 不会重走生命周期
- singletask 栈内复用模式 当打开新的activity时,如果栈内已经有了当前activity的实例,会复用栈内的,同时把该实例上面的所有实例,弹出任务栈 也是调用onNewIntent方法,不会重走生命周期
- singleInstance 单例 一个任务栈只持有一个实例
scheme跳转协议
Handler
Handler机制是一种线程间通讯机制,在我们在activity中初始化一个handler时,handler的构造函数中获取获取looper对象,且再使用looper对象获取MessageQueue消息队列,所以我们需要在handler构造之前实例化looper对象,主线程在应用启动时的main方法里,调用了Looper.prepare()方法,里面初始化了一个新的Looper对象,并且存放在了ThreadLocal中,
初始化Handler
Looper.prepare() 初始化Looper
ThreadLocal Thread.get() = ThreadLocalMap 以ThreadLocal为key,Entry[]为值
handler.sendMessage()
Looper.loop() MessageQueue
HandlerThread 一个封装了Looper的thread
IntentService 一个封装了handler和HandlerThread的Service
ANR的产生和处理
- 基本上四大组件都是在主线程里处理的,所以产生应用ANR的原因基本上都是在主线程中做耗时操作
- 解决ARN 使用AsynTask HandlerThread进行耗时操作
UI卡顿
- 每秒六十帧 十六毫秒一帧 所以十六毫秒刷新一次,超过这个界值,肉眼看上去就会卡顿
- overdraw 过渡绘制 布局layout过于复杂
- 同一时间动画执行次数过多
- hierarchyView工具检测 View的绘制过程的速度
解决办法
- 布局优化
- listview及adapter优化,列表滑动时不加载图片
- 避免ANR
内存溢出
检测工具 LeakCanary,其原理是监控每个activity,在activity ondestory后,在后台线程检测引用,然后过一段时间进行gc,gc后如果引用还在,那么dump出内存堆栈,并解析进行可视化显示。使用LeakCanary可以快速地检测出Android中的内存泄露。
- 单例
- 非静态内部类
- Handler
- 尽量避免使用static成员变量
- 资源未关闭
网络优化
- AndroidStudio自带的Monitor检测网络
- 使用Fildder抓包工具检测
优化方式
- 做缓存操作
- 避免过度网络请求
- 根据实际需求制定网络请求策略,WIFI或者使用流量,策略是不同的
APK瘦身
- 移除无用代码
- 避免无用的库,或者功能相似的库
- 启用混淆
- 第三方库的瘦身,仅保留自己需要的一部分
- 图片转为WebP
- 在允许的情况下,针对用户机型分布保留特定架构的So;