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);
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:清除活动堆栈的主要内容,如果未能解决你的问题,请参考以下文章
清除旧 SDK(缺少 FLAG_ACTIVITY_CLEAR_TASK)上的完整 Android 活动堆栈
java 杀死当前活动,清除堆栈,完成-----链接:http://stackoverflow.com/questions/8631095/android-preventing-going-back-