Activity启动模式几点需要注意的问题

本文包含内容

  1. 4中启动模式基本介绍
  2. 项目中应用场景
  3. TaskAffinity注意事项
  4. 面试中被问的几个问题

启动模式

  1. standard

    • 标准启动模式,系统默认模式
    • 每次启动会创建一个新实例,不管这个实例是否存在
    • 谁启动了这个Activity,那么Activity就运行在启动这个Activity的Activity所在的栈中
    • 如果Activity的启动模式是SingleInstance && 任务栈不是默认的任务栈 , 那么通过该Activity启动Activity,会出现在默认的栈中
    • 由于非Activity类型的Context并没有所谓的栈,所以要启动Activity的时候为待启动的Activity添加FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候会把待启动的Activity添加到默认的Activity栈中即名字为包名的Activity栈。
  2. singleTop

    • 栈顶复用模式
    • 如果待启动的Activity位于栈顶,那么此Activity就不重新创建,会走它的onNewIntent(Bundle b)方法,该Activity的onCreate、onStart不会被系统调用。
    • 如果待启动的Activity不位于栈顶,就会重新创建实例
  3. SingleTask

    • 栈内复用模式
    • 只要待启动Activity在栈内存在,就不会重新创建实例,会重新走onNewIntent方法
    • clearTop效果,如果待启动Activity上面还有其他Activity会被销毁,让待启动Activity出现在栈顶的位置
  4. SingleInstance

    • 单实例模式

    • 栈内复用 + 单独存在于一个栈中,说明:如果不和TaskAffinity结合使用,那么该Activity还是存在默认(名字为包名)任务栈中,如下:

        Running activities (most recent first):
        TaskRecord{407b51b8 #44 A com.example.androidreview}
        Run #3: HistoryRecord{407b4f48 com.example.androidreview/.activity.SingleInstanceActivity}
        TaskRecord{40751b30 #43 A com.example.androidreview}
        Run #2: HistoryRecord{4072cab0 com.example.androidreview/.MainActivity}
        Run #1: HistoryRecord{406624b8 com.example.androidreview/.MainActivity}
        TaskRecord{40697e80 #2 A com.android.launcher}
        Run #0: HistoryRecord{40696848 com.android.launcher/com.android.launcher2.Launcher}
      

    可见:SingleInstanceActivity和MainActivity都是在com.example.androidreview这个栈内,但是id是不同的,分别是#42,#43

应用场景

  1. standard:普通展示页面
  2. singleTop :适用于展示通知详情的Activity,在点开某个通知后,再点开一个通知就复用
  3. singleTask:应用主页
  4. singleInstance:拨号、闹钟

TaskAffinity

  • 这个参数可以翻译为任务相关性。
  • 这个参数标识了一个Activity所需要的任务栈的名字
  • 默认情况下,所有Activity所需的任务栈的名字是应用的包名。
  • 我们通过为Activity设置TaskAffinity来为该Activity设置回退栈,不能和包名相同,否则就相当于没指定了
  • TaskAffinity和SingleTask/SingleInstance模式或者allowTaskReparenting属性配对使用。
  • TaskAffinity的值为字符串,且中间必须含有包名分隔符"."
  • 指定Activity的启动模式为SingleInstance,但是不指定TaskAffinity,那么该Activity还是创建在默认的Activity栈中,并不会创建新的栈
  • 在非Activity的Context中启动Activity需要在Intent中添加FLAG_ACTIVITY_NEW_TASK,这样启动的Activity,默认是启动在包名下的Activity栈中。

小伙子你知道吗?

  1. 在非Activity的context中启动Activity,需要怎么做?这样做会创建一个新的Activity栈吗?

    添加FLAG_ACTIVITY_NEW_TASK

    会使用默认的Activity栈,即TaskAffinity为包名的的栈

  2. 一个Activity的启动模式为SingleInstance,启动它会创建一个新的Activity栈吗

    经测试,如果指定了Activity为SingleInstance启动模式但是没有设置TaskAffinity,那么不会创建新的Activity栈,还是默认的名字为包名的栈,但是序号是不同的,如上面介绍中看到的。如果自定义TaskAffinity,那么会创建新的Activity栈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值