Android启动新活动时关闭所有其他活动

5
我有一个Android活动问题。
我的步骤如下:
1. "登录活动" 开始 2. 登录成功。 "主菜单活动" 开始,我结束了 "登录活动". 3. 用户点击设置,启动 "设置活动"。由于它是菜单,因此不结束 "主菜单活动"。 当用户在设置屏幕上按返回键时,我需要返回到 "主菜单活动"。所以我不能杀死 "主菜单"。 4. 用户点击注销, 我结束 "设置活动" 并启动 "登录活动"。当用户返回登录时,我需要杀死 "主菜单活动",但我不能。:/ 5. 我尝试了 FLAG_ACTIVITY_SINGLE_TOP、CLEAR_TOP、SINGLE_TASK、NEW_TASK、NO_HISTORY等几乎所有的选项都没有起作用。 6. 我放置了 launchMode="singleTask", clearTaskOnLaunh="true" 等,仍然不起作用。 7. 我尝试了 addFlags() 和 setFlags() 两种方法,都不起作用。 8. 关于这个主题有很多问题,在这里,我阅读并应用了所有建议的解决方案,但都没有起作用。
请问有人能帮忙吗?
P.S 对于我的应用程序,android:minSdkVersion="8"和 android:targetSdkVersion="15"。我没有在应用程序中使用片段,而是使用旧的活动结构。

请使用NO_HISTORY并手动覆盖onBackpress方法来进行返回操作。我认为这将解决您的问题。 - Jackson Chengalai
5个回答

6

使用以下两个标识的组合:

Intent intent = new Intent(this, Login.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
        finish();

这将删除所有其他活动并启动此活动。

试试这个。

对于API级别<11

i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY | 
              Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);

实际上似乎没有名为Intent.FLAG_ACTIVITY_CLEAR_TASK的标记,也许您指的是Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET? - anzaidemirzoi
此功能从API级别11开始提供。 - vipul mittal
https://dev59.com/wGgu5IYBdhLWcg3wv5mm - vipul mittal
OP在他的帖子中说minSdkVersion="8"。他不能使用Intent.FLAG_ACTIVITY_CLEAR_TASK。在回答问题之前,您需要仔细阅读问题。 - David Wasser
我的错误。但是我发布的链接提供了一个替代选项来使用这个标志。 - vipul mittal

3
我建议启动设置活动以获取结果(请参见此处),当用户请求注销时,相应地设置一个结果。您将在MainActivity的onActivityResult(请参见此处)中获得此结果,并可以在那里处理注销,在启动loginActivity之前完成mainActivity的结束。

2
你的解决方案看起来很合理,这肯定会起作用。只是比设置一个标志位多了一些行,谢谢。我可能会使用这个。我感激不尽。 - anzaidemirzoi
这个工作得很好。非常感谢。但我希望有一天能学会如何使用标志来做到这一点。 - anzaidemirzoi

1

我建议您在启动主菜单时不要结束Login活动。然后,您可以通过执行以下操作始终在注销时清除所有活动:

    Intent intent = new Intent(this, Login.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

这只有在任务堆栈的根部(即开头处)仍处于“登录”活动状态时才能起作用。
为了防止用户从“主”活动回退到“登录”活动,您可以在“主”活动中重写“onBackPressed()”并执行其他操作。

0
Intent intent = new Intent(MainActivity.this, MyActivity2.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                    | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                    finish();

在这个例子中,Mainactivity 会自动关闭并启动 Myactivity2。 还有一件事情需要添加 finish();。

0
使用FLAG_ACTIVITY_CLEAR_TOP这样用-
Intent loginIntent = new Intent(this, Login.class);
        loginIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(loginIntent);
    finish();

我已经尝试过了,但在你写下之后我又尝试了一次,但仍然没有起作用。谢谢。 - anzaidemirzoi
Intent i = new Intent(SettingsActivity.this, StartupActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); - anzaidemirzoi
这不起作用是因为“登录”活动不在任务堆栈中。他已经完成了它。如果“登录”活动仍然在任务堆栈的根部,那么这将起作用。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接