如何阻止startActivity创建相同Activity的两个实例

时间:2012-12-28 23:15:32

标签: android back-button

活动A有一个按钮,在onclick它启动新活动B时,新活动只有最少的onCreate功能。

在活动A中,我按下一个使用

的按钮
startActivity(new Intent(A.this, B.class)) 

开始活动B.当我运行程序时,按下活动A中的按钮,活动B开始,但我必须使用两次后退按钮退出并返回第一个活动。

当单击A中的按钮时,我检查了logcat,同时生成了两个相同的实例。此外,我尝试在活动B的Toast中使用onCreate进行调试,这表明当我使用后退按钮时,它会调用另一个双B活动中的onCreate。我发现这篇帖子Clicking the back button twice to exit an activity没有回答这个问题。

我可以阻止它制作双实例的唯一方法是使用tag:launchMode= "singleInstance"明确地将其限制为清单中的活动。

问题仍然存在:

  1. 为什么它会产生两个实例?
  2. 如何阻止它或如何正确使用它以免这种情况发生?
  3. 更多解释: 代码:Activity A有一个buttOnClick()函数,其中有一个开关(view.getId()),用于检查单击了哪个按钮。每种情况都使用特定的整数参数(按钮ID)调用函数动画。在此函数中,再次切换检查id并使用setAnimationListener运行与按钮对应的动画。在动画结束时,它要求启动新活动。这是它的样子:

    public void myButtonOnClick(View view)
        {
    
    
            switch (view.getId()) {
    
            case R.id.button1:
    
                animation(1);
    
                break;
               //....more lines.....  }}
    public void animation(int a){
    
               //...code...
    
              switch(a){
    
            case 1:
                anim.setAnimationListener(new AnimationListener() {
    
                    public void onAnimationStart(Animation arg0) {
                        // TODO Auto-generated method stub
    
                    }
    
                    public void onAnimationRepeat(Animation arg0) {
                        // TODO Auto-generated method stub
    
                    }
    
                    public void onAnimationEnd(Animation arg0) {
                        Intent in =new Intent(A.this,     B.class);
                        startActivity(in.addFlags(      Intent.FLAG_ACTIVITY_CLEAR_TOP ));
                        animClear();
                    }
                });
    
    
                break;
    //......... other cases......}
    

1 个答案:

答案 0 :(得分:2)

Intent flags

我自己使用了一组FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,但这可能是一种过度杀伤。

然后只是

startActivity(new Intent(A.this, B.class).addFlags(intent_flags));