3

在我的菜单中,我有一些项目。Home 是其中的一项,我想成为我的应用程序的根,每当用户单击它时,Android 都会清除堆栈,然后返回主屏幕。

这是我的代码:

menu.setOnItemClickedListener(new MenuClickedListener() {
            public void eventOccured(int id) {          

                Intent intent = null;
                switch(id) {
                    case 1: intent = new Intent(context, More.class);           break;
                    case 2: intent = new Intent(context, FavoriteScreen.class); break;
                    case 3: intent = new Intent(context, VideoShowList.class);  break;
                    case 4: intent = new Intent(context, ShoppingList.class);   break;
                    case 5: intent = new Intent(context, MainScreen.class); 
                            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                            break;                  
                }       

                if(intent != null)
                    context.startActivity(intent); 
            }
        });

菜单工作正常,但似乎标志不起作用,因为从主屏幕,我进入第二个和第三个屏幕,然后我单击菜单的主项并返回主屏幕。现在,当我点击后退按钮时,我会转到第三个屏幕、第二个屏幕和主屏幕。

我将此菜单设计为小部件,以便一次性设置它并在我的所有屏幕上重复使用它。

任何建议,将不胜感激。谢谢。

4

6 回答 6

20

我已经尝试过Intent.FLAG_ACTIVITY_CLEAR_TOP但没有得到适当的解决方案所以最后这对我有帮助


Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
ComponentName cn = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(cn);
startActivity(mainIntent);

这将清除所有堆栈并仅运行LoginActivity

于 2014-04-05T12:39:10.157 回答
18

读一遍,flag_activity_clear_top 的使用永远不会有问题

以下是关于Flag_Activity_Clear_Top 用法的简单说明。

一种正确使用的衬垫配方:

它总是清除调用活动和被调用活动之间的中间活动(如果有的话)。

这是一个活动流程:

活动 A -> 活动 B -> 活动 C(使用标志活动清除​​顶部转到 D)-> 活动 D

在上面的序列中,当我们按回到达 D 时,我们将得到 Activity C->Activity B-> Activity A因为在 Activity C 和 Activity D 之间没有中间活动

这里一些开发人员的神话是 -

通过使用 C 中的标志 activity clear top 到达活动 D 后,他们期望从 D 中按下后退键会将他们带到应用程序之外。这永远不会发生

Flag_Activity_Clear_Top 总是清除两个活动之间的中间活动(如果有)

于 2013-07-01T04:30:32.903 回答
7

尝试使用这个intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);代替 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    Intent intent = new Intent(getApplicationContext(),
            yourActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    startActivity(intent);
于 2012-08-14T04:21:55.343 回答
3

如果您想启动一个 Activity 成为唯一存在的一个(即清除整个 backstack),请使用以下标志:

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

需要 API 级别 >= 11。

于 2016-02-02T10:53:40.973 回答
1

我遇到了同样的问题,我的问题是意图中的活动具有launchMode =“singleInstance”。更改为 singleTask 并且代码可以正常工作。

于 2016-08-31T11:38:03.670 回答
-3

也许这有效:

intent = new Intent(getApplicationContext(), MainScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
于 2012-08-14T03:23:42.120 回答