如何在Kotlin中组合Intent标志

73

我想像在Android中那样合并两个意图标志:

Intent intent = new Intent(this, MapsActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);

我尝试做类似这样的事情,但是对我没有起作用:

val intent = Intent(context, MapActivity::class.java)
intent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
3个回答

122

解释:

应用于标志的运算是按位或。在Java中,您可以使用|运算符进行操作。

至于[Kotlin中的]按位操作,没有特殊字符可用,只有命名函数可在中缀形式中调用。

来源

这里列出了IntLong的所有按位操作:

  • shl(bits) – 有符号左移(Java的<<
  • shr(bits) – 有符号右移(Java的>>
  • ushr(bits) – 无符号右移(Java的>>>
  • and(bits) – 按位与(Java的&
  • or(bits) – 按位或(Java的|
  • xor(bits) – 按位异或(Java的^
  • inv() – 按位反转(Java的~

解决方案:

因此,在您的情况下,您只需要在参数之间调用or即可。

intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK

它只执行其中一个吗?我可以使用and吗? - Joe199382
我知道位或运算的工作原理,但是由于位或运算符的命名为“or”,乍一看,“FlagA or FlagB”并没有传达出这实际上是FlagA和FlagB的组合。 - Ridcully

17

试试以下类似的东西:

val intent = Intent(this, MapsActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK

5

高级,可重用的Kotlin:

Kotlin中,or是Java按位或运算符|的替代品。

intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK

如果您打算经常使用组合,请创建一个意图扩展函数。
fun Intent.clearStack() {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

您可以在启动意图之前直接调用该函数。
intent.clearStack()

如果您需要在其他情况下添加额外的标志选项,可以向扩展函数添加一个可选参数。
fun Intent.clearStack(additionalFlags: Int = 0) {
    flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接