Android:从返回栈中删除所有先前的活动

160

当我在我的个人资料活动中点击注销按钮时,我希望将用户带到登录页面,需要用户使用新的凭据。

因此我使用了以下代码:

Intent intent = new Intent(ProfileActivity.this,
        LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

在“登出”按钮的onButtonClick中。

但问题是,当我在登录界面上点击设备的返回按钮时,它会带我到ProfileActivity。我本来期望当我在LoginActivity上按下设备返回按钮时应用程序应该关闭。

我做错了什么?

我还在清单文件中为我的LoginActivity添加了android:launchMode="singleTop"

谢谢


@GauravVashisth 我只是在遵循这个解决方案 https://dev59.com/62025IYBdhLWcg3wyZIn - Archie.bpgc
@abbas.aniefa 那个解决方案有点复杂。这是清除所有后退堆栈的唯一方法吗?因为我有30多个活动,所以我应该为它们编写这个广播代码吗? - Archie.bpgc
试一下这个方法:http://stackoverflow.com/questions/10961481/closing-previous-pages-in-an-application/10961508#10961508。使用广播是更好的解决方案。 - abbas.aniefa
你可以使用另一种方法来注销,一旦注销,将一个标志位存储在sharedpreferences中,在每个活动的onRestart()方法中检查这个变量的值,如果设置为true,可以结束当前活动。所以无论有多少个活动在后台打开,都能完成所有的活动。 - Hiren Dabhi
您的原始代码实际上适用于API级别11或更高版本,只需要进行微调即可。您只需要将标志集中在单个调用中:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 我从这个问题中得到了答案:https://dev59.com/5XA75IYBdhLWcg3wGlAa - jokeefe
可能是Android:清除活动堆栈的重复问题。 - Mehdi Dehghani
18个回答

3

您可以使用以下方法

    fun signOut(context: Context) {
        try {
                val intent = Intent(context, SplashActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
                context.startActivity(intent)
                (context as Activity).finishAffinity()
            }
        } catch (e: Exception) {
            LogUtils.logE("EXCEPTION", e)
        }

    }

2

尝试这个,它会起作用:

Intent logout_intent = new Intent(DashboardActivity.this, LoginActivity.class);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
logout_intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(logout_intent);
finish();

2

我也遇到了同样的问题...

在登录活动中,我的做法是:

    Intent myIntent = new Intent(MainActivity.this, ActivityLoggedIn.class);
    finish();
    MainActivity.this.startActivity(myIntent);  

退出登录时

   Intent myIntent = new Intent(ActivityLoggedIn.this, MainActivity.class);
   finish();
   ActivityLoggedIn.this.startActivity(myIntent);

这个方法很好用,但是当我在ActivityLoggedIn中最小化应用并点击应用抽屉中的启动器图标时,MainActivity会再次启动 :-/。我正在使用flag标志

android:LaunchMode:singleTask 

针对MainActivity的内容。


2

对于我来说,没有任何意图标志符合我的要求,但这是我解决它的方法:

当用户从一个活动中注销时,我必须从该活动中广播一条消息,然后在我想要关闭的活动中接收它,在此之后调用finish(); 这样就可以很好地工作了。


2
在API 11或更高版本中,使用Intent的FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK标志来清除所有活动堆栈。
Intent i = new Intent(OldActivity.this, NewActivity.class);
// set the new task and clear flags
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |  Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(i);

1

请保持

Intent intent = new Intent(ProfileActivity.this,
    LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

4
无法使用。我仍然可以通过返回按钮进入“ProfileActivity”。 - Archie.bpgc

1

android:launchMode="singleTask"添加到您的活动清单中


-2

使用这个

Intent i1=new Intent(getApplicationContext(),StartUp_Page.class);
i1.setAction(Intent.ACTION_MAIN);
i1.addCategory(Intent.CATEGORY_HOME);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i1.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
i1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i1);
finish();

1
你知道setFlags和addFlags吗? - GvSharma

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