Activity生命周期:android
onStart(),onStop()是从Activity是否可见这个角度来回调的spa
onResume(),onPause()是从Activity是否位于前台来回调的生命周期
Activity启动过程简单理解:内存
启动Activity的请求是由Instrumentation来处理,而后它经过Binder向AMS发送请求,AMS内部维护着有个ActivityStack并负责栈内的Activity的状态同步,AMS经过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。资源
不能再onPause()中作重量级的操做,由于必须onPause()执行完之后新Activity才能够onResume同步
系统只在Activity异常终止的时候才会调用onSaveInstanceState与onRestoreInstanceState来储存和恢复数据,其余状况不会触发这个过程。可是按Home键或者启动新Activity仍然会单独触发onSaveInstanceState的调用工作流
Activity异常状况下的生命周期:it
1. 资源相关的系统配置发生改变致使Activity被杀死并从新建立io
保存和恢复view工做流程:容器
Activity被之外终止时,Activity会调用onSaveInstanceState去保存数据,而后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据,顶层容器是一个ViewGroup,通常来讲它极可能是DecorView,最后顶层容器再去一一通知它的子元素来保存数据。
2.资源内存不足致使低优先级的Activity被杀死
(1)前台Activity——正在和用户交互的Activity,优先级最高
(2)可见但非前台Activity——加入Activity中弹出了一个对话框,致使Activity可见可是位于后台没法和用户直接交互
(3)后台Activity——已经被暂停的Activity,好比执行了onStop,优先级最低
若是说不想在屏幕旋转的时候从新去建立Activity的时候能够给configChanges属性添加orientation这个值 android.configChanges="orientation"
Activity启动模式:
singleTask
状况一:先要去判断你如今有没有这个任务栈,若是没有任务栈,会去建立一个任务栈,而后建立实例去放到这个任务栈里面
状况二:有这个任务栈,直接去建立一个实例
状况三:有任务栈,也有实例,可是这个实例不在栈顶,他会把在他上面的一些实例全都干掉,而后直接去调用onNewIntent()
IntentFilter匹配规则
隐式Intent
一个Activity能够有多个IntentFilter,可是只须要有一个是相对匹配的,就能够进行跳转界面
1.action的匹配规则
若是有多个action,那么只有一个action能够匹配成功也能够仅从跳转,可是匹配区分大小写
2.actegory
若是有多个actegory,那么必须全部的actegory都匹配成功,可是你能够不写actegory,不写actegory也能够匹配成功
3.data
data由俩部分组成:mimeType和Uri
mimeType指媒体类型
Uri:
Scheme:Uri的模式,也能够说是协议,好比http,content,Scheme必须指定
Host:Uri的主机名,好比www.baidu.com, Host必须指定
Port:端口号,只有在Scheme跟Host设置的状况下,才会有意义
Path、pathPattern、pathPrefix:
Path:完整的路径
pathPattern:完整的路径,能够包含通配符
pathPrefix:表示路径的前缀信息
若是要为Intent设置完整的data,使用intent.setDataAndType();
当启动一个隐式Intent的时候,能够去判断一下是否有匹配的Activity,避免发生错误
判断方法:
1.PackageManger.resolveActivity
2.intent.resolveActivity
若是找不到相匹配的Activity就会返回null