【2016年4月11日】Activity的生命周期和启动模式

一、Acitvity生命周期
1.典型情况下的生命周期:有用户参与
1)onCreate():正在创建。做一些初始化操作,如调用setContentView去加载界面布局资源、初始化Activity所需数据等。
2)onRestart():正在重新启动。Activity从不可见状态重新变为可见状态时调用,比如按Home键切换到桌面、或者打开一个新的Activity返回时。
3)onStart():正在启动。Activity可见但没有出现在前台。
4)onResume():Activity可见并显示在前台,可以与用户进行交互。
5)onPause():正在停止。可以做一些存储数据、停止动画等工作,但不能太耗时,否则会影响新Activity的显示。
6)onStop():即将停止。可以做一些稍微重量级的回收工作,同样不能太耗时。
7)onDestroy():即将被销毁。做一些回收工作和最终资源的释放。

  • 如果新Activity透明或者没有将原Activity完全覆盖时只调用onPause方法。
  • 按Back键时,生命周期:onPause–>onStop–>onDestroy
  • 当Activity被系统回收时再打开的生命周期:onCreate–>onStart–>onResume

2.异常情况下的生命周期:Activity被系统回收或者由于当前设备的Configration发生改变从而导致Activity被销毁重建
1)资源相关的系统配置发生改变导致Activity被杀死并重新创建
当系统配置发生改变后,Activity会被销毁,系统hi调用onSaveInstanceState来保存当前Activity的状态(且只会在Activity异常终止时调用),这个方法调用的时机是在onStop之前。
当Activity被重新创建后,系统会调用onRestoreInstanceState,从时序上来说在onStart方法执行之后,并且把onSaveInstanceState保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。onCreate方法需要额外判断Bundle对象是否为空。
保存和回复View的层次结构和数据的工作流程:Activity被意外终止时,Activity会调用onSaveInstanceState方法来保存数据,然后Activity会委托Window去保存数据,Window再委托它上面的顶级容器,一般来说是DecorWindow来保存数据,顶级容器再一一通知它的子元素来保存数据。

当系统配置发生变化时,阻止Activity重建:指定configChanges属性,比如orientation、keyboardHidden等,多个属性值之间用”|”连接。
2)资源内存不足导致低优先级的Activity被杀死
Activity的优先级:前台Activity > 可见Activity > 后台Activity
按照以上优先级杀死Activity,后续进行数据的恢复,为了保证进程不被杀死,后台工作一般放入Service中

二、Activity启动模式
1)standard:标准模式。默认进入启动它的Activity所在的任务栈,如果用ApplicationContext启动Activity,需要指定FLAG_ACTIVITY_NEW_TASK标记位
2)singleTop:栈顶复用模式。Activity位于栈顶则不会被重新创建,onCreate、onStart方法不会被调用,会回调它的onNewIntent方法,取出当前请求的信息。
3)singleTask:栈内复用模式。只要Activity 在一个栈内存在,就不会重新创建实例,而是回调其onNewInstance方法,并调到栈顶。
默认具有cleanTop效果,会导致上面的Activity全部出栈。
某个Activity所需的任务栈:TaskAffinity属性标识了一个Activity所需的任务栈的名字,默认情况下为应用包名,任务栈分为前台任务栈和后台任务栈。当打开后台任务栈中的一个Activity时,上面的Activity都会出栈,整个后台任务栈都会被调到前台
当TaskAffinity和singleTask启动模式配对使用时,待启动的Activity会运行在名字和TaskAffinity相同的任务栈中
当TaskAffinity和allowTaskReparenting结合使用时,如果allowTaskReparenting为true时,Activity的任务栈会迁移
4)singleInstance:单例模式。单独的位于一个任务栈内。
Activity的Flags:
FLAG_ACTIVITY_NEW_TASK:指定singleTask启动模式
FLAG_ACTIVITY_SINGLE_TOP:指定singleTop启动模式
FLAG_ACTIVITY_CLEAR_TOP:同一个Task中位于它上面的Activity全部出栈,singleTask启动模式默认具有此标记位的效果,如果指定Activity的启动模式为standard,那么它连同它之上的Activity全部出栈
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:不会出现在历史列表中
三、IntentFilter
隐式调用需要Intent能够匹配目标组件的IntentFilter中设置的过滤信息。
1)action匹配规则:
Intent中的Action必须存在且和过滤规则中的一个action相同
2)category匹配规则:
Intent中如果存在必须和过滤规则中的一个匹配,可以不存在,因为在startActivity或者startActivityForResult时会默认为Intent添加”android.intent.category.DEFAULT”,而Activity可以接受隐式调用,就必须在IntentFilter中添加”android.intent.category.DEFAULT”这个category。
3)data匹配规则:
如果过滤规则中定义了data,则Intent中也要定义可匹配的data。
data由两部分组成,mimeType指媒体类型,
URI结构:://:/[||]
Scheme:URI的模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI的其它参数无效;
Host:URI的主机名,如未指定,则整个URI无效;
Port:URI中的端口号;
Path、pathPattern、pathPrefix:表述路径信息
通过setDataAndType来设置data

在隐式启动之前,采用PackageManager.resolveActivity或者Intent.resolveActivity来查找是否存在匹配的Activity。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值