Android:清除活动堆栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android:清除活动堆栈相关的知识,希望对你有一定的参考价值。

我在我的应用程序中有几个活动。并且流程非常复杂。当我点击Logout应用程序naviagates登录屏幕时,用户可以通过取消按钮退出(调用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);
答案

大多数人都错了。如果要关闭现有的活动堆栈而不管其中的内容是什么并创建新的根,则正确的标志集如下:

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

From the doc

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

如果在传递给Context.startActivity()的Intent中设置,则此标志将导致在活动开始之前清除与活动关联的任何现有任务。也就是说,活动成为否则为空任务的新根,并且任何旧活动都已完成。这只能与FLAG_ACTIVITY_NEW_TASK一起使用。

另一答案

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

Intent.FLAG_ACTIVITY_CLEAR_TOP

作为该意图的旗帜。

阅读更多关于国旗here

另一答案

这是一个简单的辅助方法,用于启动新活动,作为从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);

完成

另一答案

就我而言,LoginActivity也被关闭了。结果是,

Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK

没有帮助。

但是,设定

Intent.FLAG_ACTIVITY_NEW_TASK

帮助过我。

另一答案
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();
另一答案

这个决定很好:

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

另一答案

我注意到你要求的解决方案不依赖于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()。此后,还将完成自动恢复的其他相关活动。

另一答案

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

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

以上是关于Android:清除活动堆栈的主要内容,如果未能解决你的问题,请参考以下文章

Android:清除活动堆栈

清除整个历史堆栈并在 Android 上启动一个新活动

Android:从历史堆栈中清除旧的活动实例

清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈

java 杀死当前活动,清除堆栈,完成-----链接:http://stackoverflow.com/questions/8631095/android-preventing-going-back-

Android TalkBack 和片段堆栈