Android,Intent.FLAG_ACTIVITY_CLEAR_TOP似乎不起作用?

时间:2012-08-14 03:10:58

标签: android android-intent flags

在我的菜单中,我有一些项目。 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); 
            }
        });

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

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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:18)

阅读一次,你将永远不会遇到使用flag_activity_clear_top的问题

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

正确使用的一个班轮公式:

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

这是一个活动流程:

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

在上述序列中,如果我们按下则到达D,那么我们将得到活动C->活动B->活动A ,因为活动C和活动D之间没有中间活动

这里的一些开发者的神话是 -

通过使用来自C的标记活动清除顶部达到活动D后,他们期望在按下来自D的后退键时将它们带到应用程序之外。将永远不会发生

Flag_Activity_Clear_Top始终清除两个活动之间的中间活动

答案 2 :(得分: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);

答案 3 :(得分:1)

如果要将Activity作为唯一存在的活动(即清除整个backstack ),请使用以下标志:

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

需要API级别> = 11.

答案 4 :(得分:1)

我遇到了同样的问题,我的问题是intent中的活动有launchMode =“singleInstance”。改为singleTask,代码工作正常。

答案 5 :(得分:-2)

也许这有效:

intent = new Intent(getApplicationContext(), MainScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);