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

yav*_*dat 6 android back-button

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

在活动AI中按下一个使用的按钮

startActivity(new Intent(A.this, B.class)) 
Run Code Online (Sandbox Code Playgroud)

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

当单击A中的按钮时,我检查了logcat,同时生成了两个相同的实例.此外,我尝试在Activity B中使用Toastin onCreate进行调试,这表明当我使用后退按钮时,它会调用onCreate另一个双B活动.我发现这篇文章点击两次后退按钮退出一个不回答问题的活动.

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

问题仍然存在:

  1. 为什么它会产生两个实例?
  2. 如何阻止它或如何正确使用它,这样就不会发生?

更多解释:代码: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......}
Run Code Online (Sandbox Code Playgroud)

ara*_*aer 3

意图标志

我自己用过一套,FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED但这可能有点过分了。

然后就

startActivity(new Intent(A.this, B.class).addFlags(intent_flags));
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的答复。我尝试过,在我的情况下仅 Intent.FLAG_ACTIVITY_CLEAR_TOP 就可以解决问题。但是你能解释一下进行两项活动而不是一项活动的意外行为是从何而来的吗?另外,与在清单中添加 tag:launchMode= "singleInstance" 相比,您的方法有什么好处?最后,解决这个问题的最佳编程方法是什么?谢谢。 (2认同)