是否有可能在堆栈上启动一个活动,清除它之前的整个历史?
这种情况
我有一个活动堆栈,要么是A->B->C,要么是B->C(屏幕A选择用户令牌,但许多用户只有一个令牌)。
在屏幕C中,用户可能会采取使屏幕B无效的操作,因此应用程序希望将他们带到屏幕A,而不管它是否已经在堆栈中。屏幕A应该是我的应用程序堆栈上的唯一项。
笔记
还有很多类似的问题,但我还没有找到任何答案。我尝试调用getParent().finish() -这总是导致一个空指针异常。FLAG_ACTIVITY_CLEAR_TOP只在活动已经在堆栈上时才有效。
高级可重用Kotlin:
您可以直接使用setter方法设置标志。在Kotlin或是取代Java位或|。
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
如果你计划经常使用它,创建一个Intent扩展函数
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
你可以在启动intent之前直接调用这个函数
intent.clearStack()
如果您需要在其他情况下添加额外标志的选项,请向扩展函数添加可选参数。
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
在API级别11中添加了一个新的Intent标志:Intent。FLAG_ACTIVITY_CLEAR_TASK
澄清一下,用这个:
Java
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
科特林
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
不幸的是,对于API lvl <= 10,我还没有找到一个干净的解决方案。
“DontHackAndroidLikeThis”的解决方案确实是纯粹的伎俩。你不应该那样做。:)
编辑:
根据@Ben Pearson的评论,对于API <=10,现在可以使用IntentCompat类。可以使用IntentCompat。FLAG_ACTIVITY_CLEAR_TASK清除任务的标志。所以你也可以支持pre API level 11。
高级可重用Kotlin:
您可以直接使用setter方法设置标志。在Kotlin或是取代Java位或|。
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
如果你计划经常使用它,创建一个Intent扩展函数
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
你可以在启动intent之前直接调用这个函数
intent.clearStack()
如果您需要在其他情况下添加额外标志的选项,请向扩展函数添加可选参数。
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}