2012-08-14 97 views
3

在我的菜单我有一些项目。 Home是我想要成为我的应用程序的根的一个项目,每当用户点击它时,Android清除栈然后回到主屏幕。的Android,Intent.FLAG_ACTIVITY_CLEAR_TOP似乎不起作用?

这是我的代码:

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

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

我以为是一样的,原因'混乱的是,如果没有添加标志,那么我们使用addFlag()else setFlag()什么鱼! – 2012-08-14 05:19:42

-2

也许这个作品:

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

与代码无关。 – 2012-08-14 03:28:28

9

一切似乎都很正常,解释如何 enter image description here

如果已经有存在于堆栈中的所谓活动类型的实例,那么这种情况下被带到前台 而不是创建一个新的实例。此外,在堆栈驻留在该实例之上的所有活动都从 栈清除。

例如,假设当前活动堆栈是ABCDE,È启动一个活动C(用标志清除顶部)将清除活动ð 和E从任务,并导致在堆叠ABC

+0

谢谢亲爱的hotveryspicy,也许我没有很好地解释我的问题。其实,我熟悉它的理论。这就是我使用它的原因。我的问题是在活动E中,当我回到活动C时,那么当我点击返回按钮时,我预计不会再进入活动E.然而,根据我的代码,我可以回来看起来栈(在你的情况下活动E和D)没有清除。 – Hesam 2012-08-14 03:51:49

+0

哪个是您的第一个活动,首页? – 2012-08-14 03:55:30

+0

MainScreen.class是我的第一个活动。 – Hesam 2012-08-14 03:59:32

17

一次读它,你将永远不会有FLAG_ACTIVITY_CLEAR_TOP

这里的使用问题是关于FLAG_ACTIVITY_CLEAR_TOP的使用简单的澄清。其正确的使用

一个衬里公式:

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

下面是一个活动流程:

活性A - >活动B - >活动C(使用标志活动清楚顶部去d) - >活动d

在上述序列中伸手d。如果我们按下回来时,那么我们将获得活动C->活动B->活动A因为有活动C和活动d

之间没有中间活动210

神话这里一些开发商为 - 。

使用标志的活动,从清除C顶部到达活动d后,他们期待的是从d返回键的按下会带他们到应用程序之外, 这将永远不会发生

FLAG_ACTIVITY_CLEAR_TOP总是总是清除中间活动两项活动之间。如果任何

+4

很好的解释。如果你将解决方案包含在每个人都想要的内容中,会更好 - 让活动成为剩下的唯一一个活动。 – Jaroslav 2014-10-23 13:59:01

19

我已经试过Intent.FLAG_ACTIVITY_CLEAR_TOP但还没有得到妥善的解决办法,以便最终这有助于我

 

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

这将清除所有堆栈并仅运行登录活动

+0

这是唯一为我工作的人。 – yuttadhammo 2014-11-29 07:52:05

+0

非常感谢。它的工作原理 – 2015-07-29 15:23:34

+0

这是如此之好 – lelloman 2016-07-12 12:11:31

1

如果你想开始一个活动是唯一一个现有的(即,清除整个堆栈中),使用下面的选项:

Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 

需要API级别> = 11

0

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