2017-09-15 97 views
2

有许多与退栈管理有关的问题,但没有一个真的让我满意。我发现越接近that one,但它对我来说看起来像一个丑陋的解决方法。防止多次启动相同的活动

当活动一个上的按钮点击,我发起一个活动startActivityForResult(),期待一个简单一个 - >回堆栈。 但是,如果你垃圾邮件按钮足够快,你最终有两个意图被解雇,因此两个活动堆积A - >B - >B

我试图用FLAG_ACTIVITY_SINGLE_TOP标志,以防止创建第二活动,但它并没有改变什么:

这是活动按钮侦听器

btn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     Intent intent = new Intent(getApplicationContext(), ActivityB.class); 
     intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     startActivityForResult(intent, REQUEST_CODE); 
    } 
}); 

并且日志清楚地指出onCreate()被调用两次(而不是预期的onNewIntent):

btn.onClick()

activityB.onCreate()

btn.onClick()

activityB.onCreate()

我的活动必须singleTask也不singleInstance,他们应该只是任何常规活动的背部堆栈的一部分。任何许可将非常感谢!

+0

点击后禁用按钮。如果你真的担心,请保留一个标志来表示是否应该再次调用'startActivityForResult()'。 – CommonsWare

+0

你能发布你的清单吗? (关于2个活动) – MatPag

+0

@CommonsWare尽管禁用按钮听起来像是一种好方法,但通常它并不有效(特别是在电话繁忙时,或者仅仅是CPU速度较慢的低端设备时)。由于在调用onClick()之前单击该按钮可能会发生多次(此时已经完成了损坏并且禁用该按钮太晚了)。 –

回答

1

你的问题是由你点击两次垃圾邮件发起的活动。

以简单的方式设置布尔型字段来防止启动两个活动。

例子:

boolean isClicked; 
button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(!isClicked){ 
       isClicked = true; 
       //start activity here. 
       } 
      } 
     }); 

在你onPause()设置布尔领域

+0

这就是我在问题中关联的“解决方案”,我想避免。除了事实上,它增加了几乎10行的无价值代码,它看起来像噩梦来维持,因为你可能有几十个按钮开放活动。 – bagage

+0

你为什么不做一个开始活动的方法。所以无论你在哪里致电该活动。您可以在单个位置处理位域 –

+1

这是唯一正确的方法。当你点击一个按钮时,它不会立即调用'onClick()'方法。所有它发布的事件“按钮点击”到内部事件队列。根据手机的工作频率,正在运行的应用程序数量,CPU速度以及一百万个其他变量(无法控制的变量),可以在调用onClick()方法之前多次点击该按钮。你无法阻止这一点。你所能做的就是确保当onClick()被实际调用时,确保你不会多次处理事件。 –