防止多次启动相同的活动
有许多与退栈管理有关的问题,但没有一个真的让我满意。我发现越接近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
,他们应该只是任何常规活动的背部堆栈的一部分。任何许可将非常感谢!
你的问题是由你点击两次垃圾邮件发起的活动。
以简单的方式设置布尔型字段来防止启动两个活动。
例子:
boolean isClicked;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!isClicked){
isClicked = true;
//start activity here.
}
}
});
在你onPause()
设置布尔领域假。
这就是我在问题中关联的“解决方案”,我想避免。除了事实上,它增加了几乎10行的无价值代码,它看起来像噩梦来维持,因为你可能有几十个按钮开放活动。 – bagage
你为什么不做一个开始活动的方法。所以无论你在哪里致电该活动。您可以在单个位置处理位域 –
这是唯一正确的方法。当你点击一个按钮时,它不会立即调用'onClick()'方法。所有它发布的事件“按钮点击”到内部事件队列。根据手机的工作频率,正在运行的应用程序数量,CPU速度以及一百万个其他变量(无法控制的变量),可以在调用onClick()方法之前多次点击该按钮。你无法阻止这一点。你所能做的就是确保当onClick()被实际调用时,确保你不会多次处理事件。 –
点击后禁用按钮。如果你真的担心,请保留一个标志来表示是否应该再次调用'startActivityForResult()'。 – CommonsWare
你能发布你的清单吗? (关于2个活动) – MatPag
@CommonsWare尽管禁用按钮听起来像是一种好方法,但通常它并不有效(特别是在电话繁忙时,或者仅仅是CPU速度较慢的低端设备时)。由于在调用onClick()之前单击该按钮可能会发生多次(此时已经完成了损坏并且禁用该按钮太晚了)。 –