理解 Android Activity 的启动模式

#Android 学习计划#
#第三周#

1、Activity的启动模式有哪几种,分别用于什么场景?

Activity 的启动模式有四种:

  • standard 标准模式

    1. 系统的默认模式;
    2. 每次启动一个 Activity 都会重新创建一个新的实例;
    3. 新的 Activity 会加入到启动它的那个 Activity 所在的栈中(如果是初次启动,则新的 Activity 的 taskAffinity 值继承自 Application 的 taskAffinity,而 Application 默认 taskAffinity 为包名);
    4. 如果由非 Activity 类型的 Context (如 ApplicationContext)启动,会报错,此时需要为待启动 Activity 指定 FLAG_ACTIVITY_NEW_TASK 标记位,这样启动时会为它创建一个新的任务栈(这时待启动 Activity 实际上是以 singleTask 模式启动的)。
  • singleTop 栈顶复用模式

    1. 如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建(这时 onCreate、onStart 不会被系统调用);
    2. 新的 Activity 会加入到启动它的那个 Activity 所在的栈中(如果是初次启动,则新的 Activity 的 taskAffinity 值继承自 Application 的 taskAffinity,而 Application 默认 taskAffinity 为包名);

适用场景:通知启动的内容显示页面。当接收到多条通知时,将内容显示页面设置为 singleTop,根据 intent 显示不同的内容,不会创建多个 Activity。

  • singleTask 栈内复用模式


    1. a. 存在目标任务栈 ? 执行 b : 创建目标任务栈,创建 Activity 实例放入栈中;
      b. 栈中存在 Activity 实例 ? 把该实例调到栈顶(其上面的 Activity 全部出栈) : 创建 Activity 实例放入栈中;
    2. 需和 TaskAffinity 搭配使用,TaskAffinity 值即为 Activity 的目标任务栈(如果没设定 TaskAffinity,则默认为应用的包名,而非启动它的那个 Activity 所在的栈中 – 区别于 standard 和 singleTop 模式);

适用场景:
1. 程序入口点。例如浏览器的首页,无论从多少个 App 启动浏览器,只创建一个浏览器首页的实例,且每次都会清空该实例上面所有的 Activity;
2. 微信聊天窗口。我们在聊天窗口时,点击对方的头像进入资料页,这时对方发来一条消息,我们通过推送消息回到聊天窗口。这时点击 back 键,如果不是 singleTask,会回到刚才的资料页;如果是 singleTask,会回到微信主界面,这样才符合常理。

  • singleInstance 单实例模式

    1. Activity 只能单独地位于一个任务栈中

适用场景:闹钟响起页面。你设置了6点的闹钟,5:58你进入闹钟的设置页面,然后点击 Home 键返回,5:59你在聊微信,过了一会,闹钟响起页面的 Activity 弹出,此时你点击 Back 键:
singleInstance:回到微信;
其他启动模式:回到闹钟的设置页面。

2、清晰地描述下onNewIntent和onConfigurationChanged这两个生命周期方法的场景?

  • onNewIntent

启动模式为 singleTop、singleTask、singleInstance 的 Activity 启动时,如果目标任务栈中已存在该 Activity 的实例,则调用 onNewIntent()。在此方法中可以调用 setIntent(Intent) 刷新 Intent 数据。

  • onConfigurationChanged

当系统配置发生改变后,为了不让 Activity 重新创建,可以给 Activity 指定 configChanges 属性(比如,不想让 Activity 在屏幕旋转时重新创建 Activity,可以给 configChanges 属性添加 orientation 这个值),此时系统不会调用 onSaveInstanceState 和 onRestoreInstanceState 来储存和恢复数据,而是调用 Activity 的 onConfigurationChanged 方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值