科学健康资讯 · 内容仅供参考,不替代专业诊疗 联系我们|疾病百科
操作系统

flag_activity_new_task(使用LaunchMode方式防止多次创建activity的总结)

2023-08-22 操作系统 本文链接

  【Android优化 ─ 解决FLAG_ACTIVITY_NEW_TASK无法防止重复点击的问题】

  如果你是一位Android开发者或者操作系统优化师,那么你一定对Android的启动activity方式和launchMode很熟悉。你可能知道,在将一个activity的launchMode设置为singleTop或者singleTask后,可以避免在界面中重复点击时启动多个activity的情况。

  然而,在我们公司的项目中,我们发现当我们使用startActivityForResult方法来启动一个activity时,无论我们将其launchMode设为singleTop还是singleTask,都无法防止重复点击,仍然会启动两个activity。

  我们翻看了Android 5.0以前的源码,并发现了一些有趣的东西。在这之前,源码会先检查启动模式,如果不是FLAG_ACTIVITY_NEW_TASK,就会抛出“Activity is launching as a new task, so canceling activity result”的异常,然后并没有做任何处理。但是在5.0及其之后,源码进行了修改,我们可以看到启动模式被重新设置为FLAG_ACTIVITY_NEW_TASK。

  在startActivityForResult方法的前面,我们看到了一段注释,解释了使用这个方法的相关约定。这段注释指出,如果一个activity的启动模式是FLAG_ACTIVITY_NEW_TASK,那么这个新启动的activity将不会在原先的任务栈中运行。

  这就意味着在新的任务栈中没有其他的activity存在,也就不会有刚才的activity A。所以,新的任务栈中没有匹配到activity A时,会重新创建一个activity A并将其压入栈中。

  根据以上推理,我们可以得出以下结论:如果我们使用的是startActivityForResult方法来启动activity,那么将activity的启动模式设置为singleTask已经失效了,仍然会创建两个activity A。

  那么,我们该如何解决这个问题呢?这里有两种方法:

  首先,我们可以使用RxBinding这个由Jake Wharton开源的库,通过观察按钮的点击事件来进行判断。这样,我们就能够避免重复点击造成的重复启动activity的情况。

  另外,我们还可以在父类的activity中重写dispatchTouchEvent方法。当有一个触摸事件发生时,该事件会直接传递到根节点,并调用子View的dispatchTouchEvent方法来发送事件。我们可以在这里获取当前事件,并与上一次触摸事件进行比较。如果在一定时间范围内发现重复的点击事件,我们可以返回true来阻止该点击事件的分发。这样,按钮就不会接收到点击事件,也就实现了不再创建新的activity。

  希望以上方法能够对你解决FLAG_ACTIVITY_NEW_TASK无法防止重复点击的问题有所帮助。

本文内容仅供健康科普参考,不能替代专业医疗诊断和治疗建议。如有身体不适,请及时就医并遵从医师指导。

相关阅读