相关疑难解决方法(0)

清除任务中的所有活动?

我有一个启动画面活动,然后是登录活动.我的历史堆栈看起来像:

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()调用展开堆栈来"手动"执行此操作,但是会更脆弱并且需要维护更多代码.

谢谢

android

44
推荐指数
5
解决办法
5万
查看次数

清除较旧SDK上的完整Android活动堆栈(缺少FLAG_ACTIVITY_CLEAR_TASK)

我已经在SO上做了一些阅读和搜索,但找不到清除当前活动堆栈的方法.我的应用程序的上下文是由后台服务/通知启动的活动.

想象一下,我的应用程序允许您组织人员列表.几个小时前,您正在"查看"活动中查看人员X,现在这是您的堆栈顶部.在将来的某个时刻,服务会触发并为人Y弹出一个新的"通知"活动.从那里你可以编辑人Y的详细信息.

当你完成这个活动时,弹出堆栈并最终查看人X将是一个令人困惑的用户体验.理想情况下,我想回到用户正在做的任何事情(电子邮件等...),或者至少我的应用程序的主页.

我尝试启动"通知",FLAG_ACTIVTY_NEW_TASK但似乎没有帮助:当任务完成时,它只是回到上一个任务.我想要的似乎是Android 3的新功能FLAG_ACTIVITY_CLEAR_TASK,这在之前的SDK中并不存在.

有没有人有建议去做到这一点?

android android-intent android-activity back-stack

12
推荐指数
2
解决办法
1万
查看次数

Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK无法使用Android

好吧,那就是我的问题.

当用户按下后面的底部时,我需要删除所有已打开活动的堆栈:

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

android

7
推荐指数
1
解决办法
1万
查看次数

Android IntentCompat makeRestartActivity在2.3中没有任何作用

我在清除整个活动堆栈和运行新活动时遇到问题.在我的应用程序中,用户可以导航到其配置文件并关闭其会话.屏幕堆栈如下:

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版本?

android android-intent android-support-library

6
推荐指数
0
解决办法
622
查看次数