我有一个启动画面活动,然后是登录活动.我的历史堆栈看起来像:
SplashActivity
LoginActivity
Run Code Online (Sandbox Code Playgroud)
当用户通过LoginActivity成功登录时,我想启动WelcomeActivity,但清除整个堆栈:
SplashActivity
LoginActivity // launches WelcomeActivity ->
WelcomeActivity
// but now all three are in the history stack, while I only
// want WelcomeActivity in the stack at this point.
Run Code Online (Sandbox Code Playgroud)
我可以使用一些标志来做到这一点吗?
// LoginActivity.java
Intent intent = new Intent(this, WelcomeActivity.class);
intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)
不确定使用FLAG_ACTIVITY_CLEAR_TASK是否会清除我的任务中的所有活动.我可以通过使用startActivityForResult()调用展开堆栈来"手动"执行此操作,但是会更脆弱并且需要维护更多代码.
谢谢
我已经在SO上做了一些阅读和搜索,但找不到清除当前活动堆栈的方法.我的应用程序的上下文是由后台服务/通知启动的活动.
想象一下,我的应用程序允许您组织人员列表.几个小时前,您正在"查看"活动中查看人员X,现在这是您的堆栈顶部.在将来的某个时刻,服务会触发并为人Y弹出一个新的"通知"活动.从那里你可以编辑人Y的详细信息.
当你完成这个活动时,弹出堆栈并最终查看人X将是一个令人困惑的用户体验.理想情况下,我想回到用户正在做的任何事情(电子邮件等...),或者至少我的应用程序的主页.
我尝试启动"通知",FLAG_ACTIVTY_NEW_TASK
但似乎没有帮助:当任务完成时,它只是回到上一个任务.我想要的似乎是Android 3的新功能FLAG_ACTIVITY_CLEAR_TASK
,这在之前的SDK中并不存在.
有没有人有建议去做到这一点?
好吧,那就是我的问题.
当用户按下后面的底部时,我需要删除所有已打开活动的堆栈:
@Override
public void onBackPressed(){
Intent i = new Intent(context, CrisolMainApp.class);
i.putExtra(CrisolMainApp.CERRAR_APP, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
Run Code Online (Sandbox Code Playgroud)
关键是这与我的大多数手机一起使用,但昨天我尝试使用三星Galaxy Mini(android 2.3.3)并且它无法正常工作!它不会删除一堆活动.
谁知道为什么?
编辑:我正在检查doc,我发现在API 11上添加了"Intent.FLAG_ACTIVITY_CLEAR_TASK"(我的三星Galaxy Mini适用于Android 2.3.3,因此,API 10).......我不知道,但我想这就是问题所在.
任何人都知道如何使API低于11的工作方式相同?
我试图添加这些标志,它也没有工作:
@Override
public void onBackPressed(){
Intent a = new Intent(this, CrisolMainApp.class);
a.putExtra(CrisolMainApp.CERRAR_APP, true);
a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
a.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(a);
finish();
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
@Override
public void onBackPressed(){
Intent a = new Intent(this, CrisolMainApp.class);
a.putExtra(CrisolMainApp.CERRAR_APP, true);
a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
a.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(a);
finish();
}
Run Code Online (Sandbox Code Playgroud) 我在清除整个活动堆栈和运行新活动时遇到问题.在我的应用程序中,用户可以导航到其配置文件并关闭其会话.屏幕堆栈如下:
StartActivity(自动完成,因此不会保留在堆栈中)> MainActivity> UserProfileActivity
当用户单击"从配置文件注销"时,它应该打开将显示注册屏幕的StartActivity.我们的想法是清除所有活动堆栈,因此用户无法继续注销:
UserProfileActivity> StartActivity(并且堆栈中没有任何其他内容)
我尝试过基于IntentCompat makeRestartActivity的解决方案,该解决方案应该从启动器图标启动时启动所需的活动.它在Android 4. +中完美运行,但它在Android 2.3上无效.代码如下(取自此链接):
Intent intentToBeNewRoot = new Intent(UserProfileActivity.this, StartActivity.class);
ComponentName cn = intentToBeNewRoot.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);
Run Code Online (Sandbox Code Playgroud)
我在这里看到了另一个解决方案,基本上用一些标志创建一个intent:
Intent intent = new Intent(getApplicationContext(), StartActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但在按回StartActivity后,它返回到MainActivity(存在于堆栈中),如果没有登录,它应该是不可用的.
那么,有没有办法清除整个活动堆栈,适用于所有Android版本?