Android:清除活动
我在我的申请中有几项活动。 并且流程非常复杂。 当我点击Logout应用程序naviagates登录屏幕并从那里用户可以通过取消按钮退出(拨打finish())
当我退出或返回按钮时,系统从堆栈调用一个活动:(当我到达登录界面时,如何清除堆栈中的所有活动?调用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);
9个解决方案
296 votes
大多数人都错了。 如果要关闭现有的活动堆栈而不管其中的内容是什么并创建新的root,则正确的标志集如下:
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
来自doc:
Context.startActivity()
在API级别11中添加
如果设置在传递给的Intent中 Context.startActivity(),此标志将导致任何现有任务 将与之前要清除的活动相关联 活动开始了。 也就是说,活动成为一个新的根 否则为空任务,任何旧活动都已完成。 这个可以 仅与FLAG_ACTIVITY_NEW_TASK一起使用。
Cynichniy Bandera answered 2019-06-28T23:26:05Z
29 votes
当您在上次活动中拨打Intent.FLAG_ACTIVITY_CLEAR_TOP时,您可以随时使用
Intent.FLAG_ACTIVITY_CLEAR_TOP
作为该意图的旗帜。
阅读更多关于国旗的信息。
David Olsson answered 2019-06-28T23:26:50Z
16 votes
这是一个简单的辅助方法,用于启动新活动,作为从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);
whlk answered 2019-06-28T23:27:21Z
6 votes
清除以下代码后面的活动:
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);
完成
Hiren Patel answered 2019-06-28T23:27:47Z
4 votes
就我而言,LoginActivity也被关闭了。 结果是,
Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK
没有帮助。
但是,设定
Intent.FLAG_ACTIVITY_NEW_TASK
帮助过我。
Prashant Gami answered 2019-06-28T23:28:32Z
4 votes
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();
Sakib Syed answered 2019-06-28T23:28:50Z
3 votes
这个决定很好:
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
maXp answered 2019-06-28T23:29:30Z
2 votes
我注意到你要求的解决方案不依赖于ExitHelper.isExitFlagRaised = true;,但我想知道这是否有帮助。
我跟踪是否使用静态类变量引发退出标志,该变量在整个应用程序生命周期中存活。 在每个相关活动的ExitHelper.isExitFlagRaised = true;中,使用
@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().此后,自动恢复的其他相关活动也将完成。
Kevin Lee answered 2019-06-28T23:30:17Z
1 votes
对于Xamarin开发人员,您可以使用:
intent.SetFlags(ActivityFlags.NewTask | ActivityFlags.ClearTask);
BYISHIMO Audace answered 2019-06-28T23:30:42Z