【问题标题】:How to stop startActivity from making two instances of the same Activity如何阻止startActivity创建同一个Activity的两个实例
【发布时间】:2012-12-14 03:49:05
【问题描述】:

Activity A 有一个按钮,在其onclick 中启动新的Activity B,新的Activity 只有最小的onCreate 函数。

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

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

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

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

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

问题仍然存在:

  1. 为什么要创建两个实例?
  2. 如何阻止它或如何正确使用它,以免发生这种情况?

更多解释: 代码: Activity A 有一个 buttOnClick() 函数,其中有一个 switch(view.getId()) 检查哪个按钮被点击。每个案例都使用特定的整数参数(按钮 id)调用函数动画。在此函数中,switch 再次检查 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() 以某种方式被调用了两次,或者 Activity B 正在启动它自己的另一个实例。
  • 我不明白为什么活动 A 会创建两个实例。你能告诉我@Devunwired 活动 B 如何创建两个自身实例吗? (它不会启动任何活动)

标签: android back-button


【解决方案1】:

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));

【讨论】:

  • 感谢您的回复。我试过了,就我而言,仅 Intent.FLAG_ACTIVITY_CLEAR_TOP 就可以解决问题。但是你能解释一下进行两项活动而不是一项活动的意外行为来自哪里。另外,与在清单中添加 tag:launchMode="singleInstance" 相比,您的方法有什么好处?最后,解决这个问题的最佳编程方法是什么?谢谢。
  • 意外行为可能来自代码中的错误。说到标志和清单......我会去阅读this - 看起来甚至对这两种方法都有一些解释。
  • 谢谢,它清楚地解释了如何以及何时使用这些方法。
  • ,谢谢,它清楚地解释了如何以及何时使用这些方法。我使用了一个函数,它使用 switch-case 处理活动中的所有按钮的 onClick,在这种情况下,我使用 animationlistner 处理动画,以便我的第二个活动在动画结束时开始。在 onAnimationEnd 我调用 startActivity。这可能是代码中可能出现的错误吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多