【问题标题】:Prevent same activity to be started multiple times防止多次启动相同的活动
【发布时间】:2018-02-24 18:03:15
【问题描述】:

有很多与回栈管理相关的问题,但没有一个真正让我满意。我找到的越近是that one,但对我来说这似乎是一个丑陋的解决方法。

当点击活动 A 中的按钮时,我正在使用 startActivityForResult() 启动活动 B,期待一个简单的 A - > B 回栈。 但是,如果您向按钮发送垃圾邮件的速度足够快,最终会触发两个意图,因此两个活动堆叠在一起 A -> B -> B .

我尝试使用 FLAG_ACTIVITY_SINGLE_TOP 标志来阻止创建第二个 B 活动,但它没有改变任何东西:

这是活动A中的按钮监听器:

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

我的活动必须singleTasksingleInstance,它们应该只是作为任何常规活动的后台堆栈的一部分。任何许可将不胜感激!

【问题讨论】:

  • 按钮被点击后禁用。如果您真的很担心,请保留一个标志以表示您是否应该再次致电startActivityForResult()
  • 你能发布你的清单吗? (关于 2 项活动)
  • @CommonsWare 虽然禁用该按钮听起来是个好方法,但通常效果不佳(尤其是在电话繁忙,或者只是 CPU 速度较慢的低端设备时)。因为在调用 onClick() 之前可能会多次单击该按钮(此时损坏已经造成,禁用该按钮为时已晚)。

标签: android android-intent android-activity


【解决方案1】:

您的问题是您的按钮点击垃圾邮件启动了两个活动。

以一种简单的方式设置boolean字段以防止启动两个活动。

示例:

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

在您的onPause() 中设置布尔字段false

【讨论】:

  • 这是我在问题中链接的“解决方案”,我想避免。除了它添加了近 10 行无价值代码这一事实之外,考虑到您可能有几十个按钮打开活动,维护起来看起来像是一场噩梦。
  • 你为什么不做一个方法来开始活动。因此,无论您将活动称为何处。您可以在单个位置处理位域
  • 这是唯一正确的方法。当您单击一个按钮时,它不会立即调用onClick() 方法。它所做的只是将事件“按钮单击”发布到内部事件队列。根据您的手机的繁忙程度、运行的应用程序数量、CPU 的速度以及一百万个其他变量(您无法控制),可以在调用 onClick() 方法之前多次单击该按钮。您无法采取任何措施来防止这种情况发生。您所能做的就是确保在实际调用 onClick() 时,确保不会多次处理该事件。
  • 虽然它可能看起来“hacky”,但事实并非如此。它不是不可维护的,它是“最佳实践”,您会发现通常您需要以某种方式跟踪您启动了另一个 Activity 的事实(因为您已经更改了内部状态,因为您需要记住您正在等待调用 onActivityResult() 等),因此这是处理 onClick() 事件的正常部分。
  • 很好的信息。非常感谢你分享这么棒的信息。 @大卫瓦瑟
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多