Android:从后面的堆栈中删除所有以前的活动

当我点击我的configuration文件活动中的注销button时,我想将用户带到login页面,在那里他需要使用新的凭据。

因此我使用这个代码:

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

在注销button的onButtonClick

但问题是,当我点击设备返回button的login活动,它把我带到ProfileActivity。 我期待的应用程序应该closures,当我按下设备上的LoginActivity返回button。

我究竟做错了什么?

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

谢谢

这里提出的解决scheme,为我工作。

 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); 

但是,它要求API级别> = 11。

下面是一个解决scheme,用于在使用注销button时清除所有应用程序的活动。

每次你开始一个活动,像这样开始:

 Intent myIntent = new Intent(getBaseContext(), YourNewActivity.class); startActivityForResult(myIntent, 0); 

当你想closures整个应用程序,请执行以下操作:

 setResult(RESULT_CLOSE_ALL); finish(); 

RESULT_CLOSE_ALL是一个具有唯一整数的最终全局variables,用于表示要closures所有活动。

然后定义每个活动的onActivityResult(...)callback,所以当活动返回RESULT_CLOSE_ALL值时,它也调用finish()

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode) { case RESULT_CLOSE_ALL: setResult(RESULT_CLOSE_ALL); finish(); } super.onActivityResult(requestCode, resultCode, data); } 

这将导致closures所有活动的级联效应。

这是一个黑客,并使用startActivityForResult的方式,它不是被devise为使用。

也许更好的方法是使用广播接收器,如下所示:

在注销时,清除活动历史堆栈,防止“后退”button打开已login的活动

其他方法也参见这些线程:

Android:清除后面的堆栈

完成所有以前的活动

要完全清除活动堆栈,您需要使用TaskStackBuilder创build一个新的任务堆栈,例如:

 Intent loginIntent = LoginActivity.getIntent(context); TaskStackBuilder.create(context).addNextIntentWithParentStack(loginIntent).startActivities(); 

这不仅会创build一个新的,干净的任务堆栈,而且如果您的LoginActivity具有父级活动,它也将允许“向上”button正常运行。

什么为我工作

 Intent intent = new Intent(getApplicationContext(), HomeActivity.class); ComponentName cn = intent.getComponent(); Intent mainIntent = IntentCompat.makeRestartActivityTask(cn); startActivity(mainIntent); 

finishAffinity()在API 16中添加。在以前的版本中使用ActivityCompat.finishAffinity() 。 当你将使用intent启动任何活动并完成()当前的活动。 现在使用ActivityCompat.finishAffinity()而不是finish() 。 它将完成当前活动下的所有堆积活动。 它对我来说工作正常。

对于API 11+,您可以使用Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK

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

它将完全清除以前的所有活动并开始新的活动。

一个可能的解决scheme,我可以build议你是在我的ProfileActivity清单中添加android:launchMode="singleTop" 。 当注销被点击时,你可以注销, 再次启动你的LoginActivity。 在注销你可以打电话给这个。

 Intent in = new Intent(Profile.this,Login.class); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(in); finish(); 

我也面临同样的问题..

在login活动中,我所做的是。

  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,我最小化应用程序,并单击应用程序抽屉上的启动器button图标,MainActivity再次启动: – /我使用的国旗

 android:LaunchMode:singleTask 

为MainActivity。

使用以下活动

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 

删除用于片段的CLEAR_TASK标志。

我希望这可以用于一些人。

 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(); 

就收下吧

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

在API级别11或更高版本中,使用Intent上的FLAG_ACTIVITY_CLEAR_TASK和FLAG_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); 

你可以尝试finishAffinity() ,它closures所有当前的活动,并在Android 4.1上工作

意图标志没有为我工作,但这是我如何解决它:

当用户从一个活动中注销时,我必须从该活动中广播消息,然后在我想要closures的活动中接收它,之后我称之为finish()。 它工作得很好。

试试这个将起作用:

 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();