Android的LaunchMode,Intent flags和taskAffinity

关于Android的LaunchMode知识一直都似懂非懂,所以最近找个时间补补。

首先,关于这个知识点官网有篇文章专门说明了,链接:http://developer.android.com/guide/components/tasks-and-back-stack.html
但是文章里好多地方都写得不明确,尤其很多地方实践起来跟官网说明的有很大差异,下面我简单说明下。

1、四大LaunchMode

  • standard模式
    默认的启动模式,最常见的,没什么好说;

  • singleTop模式
    如果启动Acitivity的栈栈顶已经存在该Activity的实例,就重用该实例,通过调用Acitivity的 onNewIntent(),非onCreate();否则就会创建新的实例并放入栈顶。
    注意:计算栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的Activity实例。

  • singleTask模式
    关于这个模式,实践结果与官网描述的差异很大。官方文档称以这种方式启动的Activity总是属于一个任务的根Activity,但是经过实践结果明显不是如此,关于这点,罗老师的博客有从源码角度分析:http://blog.csdn.net/luoshengyang/article/details/6714543

    我就把罗老师的总结搬过来:

    1. 设置了”singleTask”启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在;如果存在这样的任务,它就会在这个任务中启动,否则就会在新任务中启动。因此,如果我们想要设置了”singleTask”启动模式的Activity在新的任务中启动,就要为它设置一个独立的taskAffinity属性值。

    2. 如果设置了”singleTask”启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。

  • singleInstance模式
    如果不存在该Activity的实例,则会启动一个新的栈,将新建的Activity实例放进新栈,并且保证该栈有且仅有它一个实例;如果已经存在Activity实例,则通过onNewIntent启动该实例,不重新创建。

2、Intent flags和taskAffinity

  • FLAG_ACTIVITY_NEW_TASK
    官网说法是其表现和”singleTask”一样,但是我的实践结果明显不是;关于这点,国外有网友如此说:
    FLAG_ACTIVITY_NEW_TASK … produces the same behavior as the “singleTask” launchMode …
    How the activity is started with Intent(FLAG_ACTIVITY_NEW_TASK) depends on activity affinity

    If there’s already an existing task with the same affinity as the new activity, the activity is launched into that task. If not, it begins a new task.
    So, there must be equal affinity check for singleTask launchMode.

    其说法跟上面罗老师的那篇文章如出一辙,我的想法是使用“FLAG_ACTIVITY_NEW_TASK ”或者“singleTask”时,最好搭配配置新的taskAffinity才可能出现你想要的结果。

  • FLAG_ACTIVITY_SINGLE_TOP

    • 其表现和”singleTop”一样。
  • FLAG_ACTIVITY_CLEAR_TOP
    通常配合“FLAG_ACTIVITY_NEW_TASK”一起用;

关于以上知识,这里有篇极好的文章可看看:http://blog.csdn.net/ljz2009y/article/details/26621815

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值