【问题标题】:Android, Intent.FLAG_ACTIVITY_CLEAR_TOP seems doesn't work?Android,Intent.FLAG_ACTIVITY_CLEAR_TOP 似乎不起作用?
【发布时间】:2012-08-10 07:55:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android android-intent flags


    【解决方案1】:

    我已经尝试过 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
    • 很好的解决方案!
    【解决方案2】:

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

    这里是关于 Flag_Activity_Clear_Top 用法的简单说明。

    一个正确使用的眼线配方:

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

    这是一个活动流程:

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

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

    这里有些开发者的误区是 -

    在使用 C 中的标志活动清除​​顶部到达活动 D 后,他们期望在 D 中按下后退键会将他们带到应用程序之外。这永远不会发生

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

    【讨论】:

    • 很好的解释。如果你能包含每个人都想要的解决方案,那就更好了——让活动成为后台堆栈中唯一剩下的一个。
    【解决方案3】:

    尝试使用 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);
    

    【讨论】:

    • 我也是这么想的,我很困惑的原因是如果还没有添加标志,那么我们使用 addFlag() 否则 setFlag() 什么鱼!!!
    • 这没有帮助
    【解决方案4】:

    如果您希望启动一个 Activity 成为唯一存在的 Activity(即清除整个后台堆栈),请使用以下标志:

    Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
    

    需要 API 级别 >= 11。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        也许这行得通:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多