1.Activity生命周期:
onCreate()->onStart()->onResume()->onPause()->onStop->onDestory()或(onRestart() ->onStart()->...)
onStart(),onStop() 调用时页面不可见,onResume,onPause()调用时页面可见
2.Activity 4种启动模式
1.Standard:标准模式(Activity默认启动模式),每次启动Activity会在Activity栈顶创建一个新的实例.因ApplicationContext没有任务栈,所以无法使用标准模式启动Activity,但可以为新的Activity指定新的标记位FLAG_ACTIVITY_NEW_TASK,创建一个新的任务栈(实际上是以SingleTask模式启动的)
2.SingTop:栈顶复用,若新建的Activity位于栈顶,则此Activity不会重建,而是复用栈顶实例即不会调用onCreate(),onStart().而是调用onNewIntent(),否则就新建此Activity实例并置于栈顶
3.SingleTask:栈内复用,查看该Activity想要的任务栈是否存在(通过TaskAffinity属性指定Activity想要的任务栈),若不存在则新建一个任务栈并将此Activity置于栈顶,若存在则将此栈中Activity实例以上的Activity全部出栈,使该Activity置于栈中并调用onNewIntent()
4.SingleInstance:单例模式,SingleTask模式的加强版,直接创建一个新的任务栈,创建该Activity置于栈中.一旦该模式的Activity实例已存在于某个栈中,任何应用激活该Acticity都会复用该栈中的实例,即多个应用共享该栈中的Activity实例
4种启动模式的区别:
①standard,singleTop允许多个Activity实例,而singTask,singleInstance 只允许一个实例
②standard每次都会新建Activity实例,而SingTop取决于Activity实例是否存在栈顶,SingleTask取决于Activity实例是否存在栈内,SingleInstance只会实例化一次
③Activity存储的目标栈:standard,singleTop和收到的intent处于同一个栈,SingleTask取决于TaskAffinity,SingleInstance总是新建任务栈
④只有SingleInstance独占一个任务栈,其他的可以存在其他Activity实例
3.Activity启动过程(当请求启动Activity时)
①Launcher进程通过Binder驱动向ActivityServiceManager(AMS)发起startActivity请求
②AMS收到请求后向ActivityStack发送启动Activity的请求
③ActivityStack记录需启动的Activity的信息,并调整Activity栈将其置于栈顶,通过Binder驱动将Activity的启动信息传递到ApplicationThread线程中(即Binder线程)
④ApplicationThread线程通过Handler将Activity的启动信息发送到主线程ActivityThread
⑤主线程ActivityThread类接收信息和请求后通过ClassLoader机制加载对应的Activity类,最终调用Activity的onCreate()方法,最后启动完毕
Lancher(Binder驱动)->AMS->ActivityStack(记录信息,栈内置顶,Binder驱动发送信息 )->ApplicationThread(handler发送信息)->ActivityThread(classloader加载Activity信息)
4.Activity卡顿分析
1.内存泄漏
如非静态内部类,匿名内部类,资源使用完未关闭,Handler等
2.加载大数据
如图片资源Bitmap,解决方案:压缩图片(根据显示的bitmap宽高设置采样率),缓存图片(LruCache算法)
3.UI线程做耗时操作
如数据库操作,数据计算,解决方案:开子线程处理耗时任务
4.UI视图过度绘制
解决方案:减少视图层级,使用include,merge,ViewStub加载视图
5.Activity启动速度优化
减少onCreate()时间,将onCreate()部分代码放到onResume()实现,为防止以后多次调用onResume()造成卡顿,可设置一个开关,在Oncreate里设置为true , onResume()初始化完成置为false
网友评论