此文是android开发艺术探索和android源码设计模式这两本书的读书笔记。
旧activity onPause后新activity才会启动,新activity onResume后,旧activity onStop.,所以onpause不能执行耗时工作
异常情况下生命周期
资源相关系统配置发生改变,onSaveInstanceState在onstop之前调用,保存当前Activity状态,onRestoreInstanceState在onCreat之后
onSaveInstanceState源码分析
http://www.jianshu.com/p/520e6b47c57b是备忘录模式
具体到最后是
ActivityClientRecord.state=Bundle.putBundle(window-Tag,Bundle.putSparseParcelableArray(ContentParentView-Tag,put(viewid(包括viewgroupid),state)))
就是保存的信息保存到ActivitClientRecord中
onSaveInstanceState调用几种可能
1.home键 短按长按
2.按电源键
3.屏幕切换电话打入
4.启动新activity
通过指定configChanges属性避免属性改变导致Activity重新创建,会调用onConfigurationChanged方法
资源内存不足时同上一样
启动模式
standart 谁启动了这个Activity它就在启动它的activity的栈中,如果没有任务栈就会报错,如applicationContext去启动,需要指定Flag_activity_new_task,实际上是singletask方式去启动。
singletop 如果已经在栈顶,不会重新创建,会调用 onnewintent方法 onpause onnewintent onpause顺序FLAG_ACTIVITY_SINGLE_TOP
singletask会首先寻找是否存在任务栈,没有创建。默认具有cleartop的效果。一种情况,后台任务栈中被启动,那后台任务栈会和前台任务栈合并。FLAG_ACTIVITY_NEW_TASK
singleinstance单独存在一个任务栈
TaskAffinity默认为应用的包名,如果需指定,属性值为字符串,必须含有包名分隔符"."。
和allowTaskReparenting结合,应用A启用应用B的Activity时,当应用B被启动时,允许从当前A任务栈转移到应用B的任务栈,并显示,也就是不显示b的主Activity
指定启动模式有两种方法
AndroidMenifest
无法设置clear_top
intent.addflags
无法指定singleInstance
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不会出现在历史Activity列表中和android:excludeFromRecents=true
IntentFilter匹配规则
必须同时匹配action category data
Action必须存在且匹配
category指定的必须每一个匹配,不指定startActivity\startActivityForResult默认加上android.intent.categroy.DEFAULT,所以intentfilter需要指定DEFAULT
data如果intentfilter定义了,intent必须匹配,包含两部分mimeType和URI
如果URI中没有指定Scheme默认为file和content
如果用intent指定完整data,必须用setDataAndType
resolveActivity(Intent,MATCH_DEFAULT_ONLY)方法查询匹配到的action,匹配不到返回null.
MATCH_DEFAULT_ONLY只匹配category为DEFAULT的Activity
Activity源码分析
应用启动的入口是ActivityTread.main(String[] args)方法
下面是手写的流程,很乱,大括号表示一个方法调用另一个方法
Activity生命周期和启动模式 Activity生命周期和启动模式模板模式封装固定的流程比如用final修饰,包含固定步骤,可变部分方法用abstract修饰
网友评论