Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何阻止startActivity生成同一活动的两个实例_Android_Back Button - Fatal编程技术网

Android 如何阻止startActivity生成同一活动的两个实例

Android 如何阻止startActivity生成同一活动的两个实例,android,back-button,Android,Back Button,活动A有一个按钮,在其onclick中启动新活动B,新活动只有最小的onCreate功能 在活动A中,我按下一个使用 startActivity(new Intent(A.this, B.class)) 启动活动B。当我运行程序时,按下活动A中的按钮,活动B开始,但我必须使用后退按钮两次才能退出并返回到第一个活动 我检查了logcat,当单击A中的按钮时,同时生成了两个相同的实例。我还尝试在活动B的onCreate中使用Toast进行调试,这表明当我使用后退按钮时,它会调用另一个twin B

活动A有一个按钮,在其
onclick
中启动新活动B,新活动只有最小的onCreate功能

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

startActivity(new Intent(A.this, B.class)) 
启动活动B。当我运行程序时,按下活动A中的按钮,活动B开始,但我必须使用后退按钮两次才能退出并返回到第一个活动

我检查了logcat,当单击A中的按钮时,同时生成了两个相同的实例。我还尝试在活动B的
onCreate
中使用
Toast
进行调试,这表明当我使用后退按钮时,它会调用另一个twin B活动中的
onCreate
。我发现这篇文章没有回答这个问题

我可以阻止它创建双实例的唯一方法是使用
标记:launchMode=“singleInstance”
将其显式限制为清单中的活动

问题仍然存在:

  • 为什么会有两个例子
  • 如何停止它或如何正确地使用它,这样就不会发生这种情况 更多说明: 代码:活动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......}
    

    我自己使用了一套
    标记活动|新任务|标记活动|清除|顶部|标记活动|重置|任务|如果需要
    ,但这可能是一种过度使用

    那就

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

    请发布更多的代码。问题很可能是
    startActivity()
    以某种方式被调用了两次,或者活动B正在启动自身的另一个实例。我不明白为什么要从活动A生成两个实例。您能告诉我@Devunwired活动B如何生成自身的两个实例吗?(它不会启动任何活动)感谢您的回复。我试过了,我的目的是。在我的情况下,只需标记活动清除顶部就可以解决问题。但是你能解释一下,让两个活动而不是一个活动发生意外行为的原因吗。另外,与在清单中添加tag:launchMode=“singleInstance”相比,您的方法有什么好处?最后,解决这个问题的最佳编程方法是什么?谢谢。意外行为可能来自代码中的错误。说到旗帜和舱单。。我会去读一读——这两种方法似乎都有一些解释。谢谢,它清楚地解释了如何以及何时使用这些方法。谢谢,它清楚地解释了如何以及何时使用这些方法。在使用animationlistner处理动画之后,我使用了一个函数,该函数使用switch case处理活动中所有按钮的onClick,以便我的第二个活动在动画结束时开始。在onAnimationEnd内部,我称之为startActivity。这可能是代码中的错误吗?