Activity生命周期和启动模式

此文是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生命周期和启动模式_第1张图片
图片发自App

Activity生命周期和启动模式_第2张图片
图片发自App


模板模式封装固定的流程比如用final修饰,包含固定步骤,可变部分方法用abstract修饰

你可能感兴趣的:(Activity生命周期和启动模式)