《Android开发艺术探索》阅读笔记(一)、activity生命周期 及 启动模式

一、Activity生命周期分类

正常情况下的生命周期:即在有用户参与的情况下,activity所经历的生命周期的变化。
异常情况下的生命周期:即Activity被系统回收或者由于当前设备的Configuration发生改变而导致Activity被销毁并重建的过程。

(一)、正常情况下的生命周期经历7个方法,过程如下图:

这里写图片描述
注意: 1、onStart和onResume都表示activity已经可见,但是onStart的时候activity还在后台,onResume的时候activity才显示到前台。
2、onPause必须先执行完,新Activity的onResume才会执行。所以,onPause中不应该有太耗时的操作,不然会影响新Activity的显示。
3、如果新Activity采用了透明主题,那么当前Activity不会回调onStop方法。

(二)、异常情况下的生命周期分析:

一、我们重点关注两个方法:onSaveInstanceState()和onRestoreInstanceState()

这两个方法负责activity被销毁并重建的过程中数据的保存和重现。注意:这两个方法只有在Activity异常终止的时候才会被调用来存储和恢复数据,其他情况不会调用。

onSaveInstanceState()

onSaveInstanceState()负责存储数据,将数据存储到Bundle类型的对象中,它在onStop()之前被调用,但与onPause()的调用没有确切的前后顺序。当然,在activity被杀死并重建的时候,系统会自动为我们做一些View层次结构方面的数据的存储和恢复工作。这是因为与Activity一样,每个View也都有自己的onSaveInstanceState和onRestoreInstanceState方法。

onRestoreInstanceState()

onRestoreInstanceState()方法在onStart之后被调用。
当Activity被销毁并重新创建后,有两个位置可以获取到之前保存的数据:onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)。二者的区别:onCreate如果在正常启动的情况下,其参数为null,所以如果在这里获取数据,必须进行判空处理。onRestoreInstanceState方法一旦被调用,其参数一定有值,不必额外判空。官方推荐使用onRestoreInstanceState来恢复数据。

资源相关的系统配置发生改变导致Activity被杀死并重新创建的情况内存不足导致低优先级Activity被杀死 二者的数据存储和恢复过程完全一致。
拓展:Activity的优先级:
(1)、前台Activity——正在和用户交互的activity,优先级最高
(2)、可见但非前台的Activity
(3)、后台Activity——已被暂停的Activity,比如执行了onStop方法,优先级最低。

注意:如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死。

二、android:configChanges参数及onConfigurationChanged()方法
如果不希望在系统配置发生变化时,重新创建Activity,可以在AndroidMenifest.xml中指定android:configChanges(多个值用 | 隔开),并重写onConfigurationChanged方法。

各配置项及其含义表如下图:
(注意其中的 ScreenSize是API13后新增的)
这里写图片描述

我们常用的只有local、orientation、keyboardHidden这三个选项。比如防止屏幕旋转时重启activity,需要设置的选项为android:configChanges=”orientation|screenSize”

二、Activity启动模式

(一)、启动模式简介
已知activity的启动模式有:standard、singleTop、singleTask、singleInstance四种。
其中:
1、standard模式为默认模式,进入与启动它的activity相同的TaskStack。

2、singleTop模式也比较容易理解。当要启动的activity已经在栈顶,则不会创建新实例,也不会调用其onCreate、onStart,而是调用onNewIntent继而调用onResume,然后继续正常运行。

3、singleTask模式(栈内复用模式),与之相关的一个概念是TaskAffinity参数(Activity所需的任务栈)。
eg:

<activity
        android:name="com.koala.broker.activity.NotUsedNow.InfoChooseAddressActivity"
        android:configChanges="orientation|screenSize|keyboardHidden"
        android:launchMode="singleTask"
        android:taskAffinity="com.example.task1"/>

(1)、如果不指定taskAffinity参数,则默认为包名。
(2)、如果指定的taskAffinity对应的taskStack不存在,就创建新的taskStack,并在其中创建该activity的实例。若已经存在,就在其中创建该activity的实例:如果该任务栈之前不存在该activity的实例就在栈顶创建新的实例,如果该任务栈已经存在该activity的实例,就移除其上的所有activity,再调用该activity的onNewIntent及onResume方法。

4、singleInstance(单实例模式),除了具有singleTask的所有特性外,还具有一特点:具有此模式的Activity只能单独位于一个taskStack中。一旦在某activity A中启动了singleInstance模式的activity B,就创建了一个新的taskStack,我们就无法切换回A所在的taskStack了,除非已经为B设置了taskAffinity参数(这时我们查看手机的后台任务栈数量才是正确的)。

(二)、启动模式设置
有两种设置方法:在AndroidManifest.xml中在代码中intent.addFlags();
二者的区别:1、第二种方式优先级更高 2、第一种方式无法为activity设定FLAG_ACTIVITY_CLEAR_TOP标识,第二种无法设置singleInstance模式。

第二种方式还可以配合四种Flags使用:
Intent.FLAG_ACTIVITY_SINGLE_TOP 与加载模式singleTop功能相同
Intent.FLAG_ACTIVITY_NEW_TASK 与singleTask相同
Intent.FLAG_ACTIVITY_CLEAR_TOP 若与singleTop配合,销毁目标Activity和它之上的所有Activity,重新创建目标Activity。若与singleTask配合,销毁目标Activity之上的所有Activity,若目标activity已经存在就调用onNewIntent,否则创建其实例。
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 相当于xml中指定android:excludeFromRecents=”true”

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值