intent.setFlags方法中参数值的含义

  intent.setFlags()方法中参数的含义

  1.FLAG_ACTIVITY_NEW_TASK:

  例如现在栈一的情况是:A    B   C(C位于栈顶),C通过intent跳转到D,并且这个Intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中声明了添加Task affinity,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果存在,就将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。如果D的Task affinity默认没有设置,则会将其压入栈1,变成A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。但如果试图从非Activity的非正常途径启动一个activity,比如从一个service、BroadcastReceiver等中启动一个Activity,则intent要设置Intent.FLAG_ACTIVITY_NEW_TASK标记。Activity要存在于Activity栈中,而非Activity的途径启动Activity时必然不存在一个Activity的栈,所以要新建一个Activity栈来存放要启动的Activity。

  2.FLAG_ACTIVITY_CLEAR_TOP:

   例如现在的栈情况为A B C D, D此时通过intent跳转到B,如果这个intent设置FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。如果没有添加这个标记,则栈的情况将会变为:A B C D B 。也就是说,如果设置了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已存在,则会把位于该目标Activity之上的Activity从栈中弹出销毁。

    3.FLAG_ACTIVITY_NO_HISTORY:

   例如现在栈的情况为:A B C 。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,返回到C,栈的情况是:A  B  C。如果D中又跳转到E,栈的情况为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。

  4.FLAG_ACTIVITY_SINGLE_TOP:

   和Activity的Launch mode的singleTop类似。如果某个intent设置了这个标志,并且这个intent的目标Activity就是栈顶的Activity,那么将不会新建一个实例压入栈中。简言之,目标Activity已在栈顶则跳转过去,不在栈顶则在栈顶新建Activity。

 

因此,使用startActivity的时候,会遇到如下异常:

  Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

  Context中有一个startActivity方法,Activity继承自Context,覆写了startActivity方法。如果使用Activity的startActivity方法,不会有任何问题,而如果使用Context的startActivity方法,就必须新建一个Activity栈,遇到上面的异常,是因为使用了Context的startActivity方法。解决的办法是:为intent设置一个flag,即intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);这样就可以在新的Activity栈里启动这个Activity了。

  以上内容转自:http://blog.csdn.net/berber78/article/details/7278408

转载于:https://www.cnblogs.com/dazuihou/p/3602010.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`Intent.setFlags()` 方法用于设置 `Intent` 的标志(flags),这些标志可以影响 `Intent` 的行为和启动方式。以下是常见的标志参数及其含义: 1. `Intent.FLAG_ACTIVITY_NEW_TASK`:将目标 `Activity` 启动在一个新的任务栈。如果当前没有任务栈存在,将创建一个新的任务栈。 2. `Intent.FLAG_ACTIVITY_CLEAR_TASK`:启动一个新的任务栈,并且清除所有该任务栈的现有实例。这个标志通常与 `FLAG_ACTIVITY_NEW_TASK` 一起使用。 3. `Intent.FLAG_ACTIVITY_SINGLE_TOP`:启动模式为 `singleTop`,表示如果目标 `Activity` 已经位于栈顶,那么不会创建新的实例,而是会调用目标 `Activity` 的 `onNewIntent()` 方法来处理新的 `Intent`。 4. `Intent.FLAG_ACTIVITY_CLEAR_TOP`:如果目标 `Activity` 已经在任务栈存在,将会将其之上的所有实例都关闭,使得目标 `Activity` 成为栈顶。这个标志通常与 `FLAG_ACTIVITY_SINGLE_TOP` 一起使用。 5. `Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS`:启动的 `Activity` 不会出现在最近使用的应用列表(Recent Apps)。 6. `Intent.FLAG_ACTIVITY_NO_HISTORY`:启动的 `Activity` 不会保留在返回堆栈,即按下返回键时不会返回该 `Activity`。 这只是一些常见的标志参数,还有其他更多的参数可以用于特殊的需求。你可以通过使用 `Intent.FLAG_` 前缀来查看可用的标志选项。 注意:标志参数可以通过使用按位或(`|`)运算符进行组合,例如:`intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP)`。 请注意,在使用这些标志时要谨慎,确保理解其含义并根据需要正确使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值