Mar*_*tin 311 stack android clear android-intent android-activity
在Android中我有一些活动,比方说A,B,C.
在A中,我使用此代码打开B:
Intent intent = new Intent(this, B.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在B中,我使用此代码打开C:
Intent intent = new Intent(this, C.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
当用户点击C中的按钮时,我想返回A并清除后栈(关闭B和C).因此,当用户使用后退按钮B和C将不会显示时,我一直在尝试以下内容:
Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
但是当我回到活动A时,如果我使用后退按钮,B和C仍然会出现.我怎么能避免这种情况?
Jak*_*ile 422
尝试FLAG_ACTIVITY_NEW_TASK按照以下文档中的说明添加FLAG_ACTIVITY_CLEAR_TOP:
此启动模式也可以与FLAG_ACTIVITY_NEW_TASK结合使用:如果用于启动任务的根活动,它将把该任务的任何当前运行的实例带到前台,然后将其清除到其根状态.这在从通知管理器启动活动时尤其有用.
所以你要启动的代码A是:
Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish(); // call this to finish the current activity
Run Code Online (Sandbox Code Playgroud)
小智 142
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
Dom*_*erg 73
如何为相关活动添加清单文件:
android:noHistory="true"
Run Code Online (Sandbox Code Playgroud)
到B和C的活动定义?它们不会被添加到Backstack中.不确定这是不是你想要的.
Gen*_*wen 58
这困扰了我很长一段时间.最后我通过这样做来解决这个问题:
在片段中,使用:
Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在Activity中,使用(Intent.FLAG_ACTIVITY_CLEAR_TASK与片段相比再添加一个intent标志):
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
Jos*_*arl 28
android:launchMode="singleTop"到活动A的清单中的activity元素intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 和
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)这意味着当启动活动A时,将清除其上的所有任务,以便A位于顶部.在根处创建一个新的后备栈,并且使用singleTop确保您只启动一次A(因为A现在位于顶部..._CLEAR_TOP).
Dan*_*ler 26
从API 16(Jelly Bean)开始,您可以打电话finishAffinity().
现在您也可以ActivityCompat.finishAffinity(Activity activity)使用兼容性库进行调用.
确保将清单中的taskAffinity设置为该组活动所特有的包名称.
有关详细信息,请参阅:http:
//developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29
Muh*_*Ali 15
尝试使用
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Run Code Online (Sandbox Code Playgroud)
并不是
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
Run Code Online (Sandbox Code Playgroud)
如果你的应用程序有最低sdk版本16,那么你可以使用 finishAffinity()
完成此活动以及当前任务中具有相同亲缘关系的紧接其下的所有活动.
这对我有用.在Top Top屏幕中删除所有后栈活动,
@Override
public void onBackPressed() {
finishAffinity();
startActivity(new Intent(PaymentDoneActivity.this,Home.class));
}
Run Code Online (Sandbox Code Playgroud)
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
添加android:noHistory="true"属性到你<activity>在AndroidManifest.xml这样的:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
Run Code Online (Sandbox Code Playgroud)
对于将来的研究,请尝试此代码.
Intent intent = new Intent(context, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)
使用此代码启动新活动并关闭或销毁所有其他活动堆栈或返回堆栈。
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
Use finishAffinity() to clear all backstack with existing one.
Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C,
- Activity B will be finished / removing from stack.
- Activity A will be finished / removing from stack.
- Activity C will finished / removing from stack.
Run Code Online (Sandbox Code Playgroud)
小智 6
我找到了一个有趣的解决方案,可能会有所帮助。我用我的onBackPressed()方法做到了这一点。
finishAffinity();
finish();
Run Code Online (Sandbox Code Playgroud)
FinishAffinity删除现有活动与其堆栈的连接。然后完成帮助您退出该活动。这将最终退出应用程序。
在 kotlin 中,它与 java 几乎相同。只有| 符号由或文本替换。所以,它是这样写的——
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
Run Code Online (Sandbox Code Playgroud)
您可以直接使用 setter 方法设置标志。在 Kotlin 中,or它是Java 按位或 的替代品|。
intent.flags = FLAG_ACTIVITY_NEW_TASK or FLAG_ACTIVITY_CLEAR_TASK
Run Code Online (Sandbox Code Playgroud)
如果多次使用,请创建一个 Intent 扩展函数
fun Intent.clearStack() {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
Run Code Online (Sandbox Code Playgroud)
然后您可以在启动意图之前直接调用此函数
intent.clearStack()
Run Code Online (Sandbox Code Playgroud)
如果您需要在其他情况下添加附加标志的选项,请向扩展函数添加可选参数。
fun Intent.clearStack(additionalFlags: Int = 0) {
flags = additionalFlags or Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
239789 次 |
| 最近记录: |