Android: Clear Activity Stack Android: 清除活动堆栈

我的申请中有几个活动。流程非常复杂。当我点击注销应用程序导航到登录屏幕,从那里用户可以退出取消按钮(调用 system.exit(0))

当我退出或返回按钮时,系统从堆栈中调用一个活动: (当我到达登录屏幕时,如何清除堆栈中的所有活动?调用 finish()是不实际的,因为有这么多的活动和一些活动不应该关闭时,他们是活跃的,如本地相机调用活动。

validateuser logoutuser = new validateuser();
logoutuser.logOut();
Intent loginscreen = new Intent(homepage.this, Login2.class);
(homepage.this).finish();
loginscreen.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(loginscreen);
121828 次浏览

当您在最后一个活动上调用 startActivity时,您总是可以使用

Intent.FLAG_ACTIVITY_CLEAR_TOP

作为这个意图的标志。

阅读更多关于标志 给你的信息。

在我的例子中,LoginActivity 也是关闭的,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

没有帮助。

然而,设置

Intent.FLAG_ACTIVITY_NEW_TASK

帮了我。

你们大多数人都错了。如果您想关闭现有的活动堆栈,而不管堆栈中有什么,并创建新的根,正确的标志集如下:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

来自文件 :

public static final int FLAG_ACTIVITY_CLEAR_TASK
在 API 等级11中添加

如果在传递给 Context.startActivity(),此标志将导致任何现有的任务 将会与该活动相关联,以便在 活动已启动,即该活动成为 否则任务为空,任何旧的活动都将结束 只能与 FLAG_ACTIVITY_NEW_TASK一起使用。

下面是一个简单的辅助方法,用于启动一个新活动作为新的 top 活动,从 API 级别4一直工作到当前版本17:

static void startNewMainActivity(Activity currentActivity, Class<? extends Activity> newTopActivityClass) {
Intent intent = new Intent(currentActivity, newTopActivityClass);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
intent.addFlags(0x8000); // equal to Intent.FLAG_ACTIVITY_CLEAR_TASK which is only available from API level 11
currentActivity.startActivity(intent);
}

从你目前的活动中可以这样说:

startNewMainActivity(this, MainActivity.class);

返回状态 代码如下:

Intent intent = new Intent(Your_Current_Activity.this, Your_Destination_Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

成交

Intent intent = new Intent(LoginActivity.this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //It is use to finish current activity
startActivity(intent);
this.finish();

我注意到您要求的解决方案不依赖于 finish(),但我想知道这是否仍然有帮助。

我跟踪了是否用静态类变量引发了退出标志,静态类变量在整个应用程序生命周期中都存在。在每个 相关的活动的 onResume()中,使用

@Override
public void onResume() {
super.onResume();
if (ExitHelper.isExitFlagRaised) {
this.finish();
}
}

ExitHelper 类

public class ExitHelper {
public static boolean isExitFlagRaised = false;
}

假设在 mainActivity 中,用户按一个按钮退出-您可以设置 ExitHelper.isExitFlagRaised = true;,然后设置 finish()。此后,自动恢复的其他相关活动也将完成。

这个决定行之有效:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

但是新的活动启动很长时间,你有时会看到白屏。如果这很重要,那么使用下面的解决方法:

public class BaseActivity extends AppCompatActivity {


private static final String ACTION_FINISH = "action_finish";


private BroadcastReceiver finisBroadcastReceiver;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);


registerReceiver(finisBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
finish();
}
}, new IntentFilter(ACTION_FINISH));
}


public void clearBackStack() {
sendBroadcast(new Intent(ACTION_FINISH));
}


@Override
protected void onDestroy() {
unregisterReceiver(finisBroadcastReceiver);
super.onDestroy();
}
}

使用方法:

public class ActivityA extends BaseActivity {


// Click any button
public void startActivityB() {
startActivity(new Intent(this, ActivityB.class));
clearBackStack();
}
}

缺点: 堆栈上必须关闭的所有活动都必须扩展 BaseActivity

对于 Xamarin 开发人员,您可以使用:

intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);

使用 Kotlin:

您可以使用 setter 方法直接设置标志。在 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()

意图 = 新意图(LoginActivity.this,MainActivity.class) ; 意图.setFlags (意图.FLAG _ ACTIVITY _ NEW _ TASK | 意图.FLAG _ ACTIVITY _ CLEAR _ TASK) ; Start 活动(意图) ; 完成() ;