亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述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);
【Android(清除活动堆栈)】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);
推荐阅读
- Sharepoint Approval Work Catch批准按钮
- 如何在Android中再次设置布尔值true()
- SQLite with Foreign Key + Models Android Studio CRUD
- BlackBerry - html链接到App World中的应用程序
- 技术同时编写iPhone,黑莓和Android手机( [关闭])
- 不幸的是,Apps已停止在某些Android设备上
- BlackBerry - 如何为Application设置图标()
- Blackberry ListField Text Wrapping - 只有两行
- 每次从后台恢复应用程序时都会打开启动屏幕,如WhatsApp指纹屏幕