点击按钮跳转新的activity,可能会出现多次跳转的bug
1、通过AOP切面可以解决(这里不讨论)
textView.setOnClickListener(new OnClickListener() {
@EnableFastOnClick
@Override
public void onClick(View v) { }
});
看起来简洁,对每一处进行注解开发成本高,容易遗漏。
2、通过设置Activity的启动模式singleTop
singleTop: 如果任务栈顶存在这个要开启的Activity,不会重新创建Activity,而是复用已经存在的Activity。
在清单文件中设置简单,但是这样就只能指定singleTop,开发成本较高,容易遗漏
3、最佳方案:拦截
public abstract class BaseActivity extends AppCompatActivity {
@Override
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (startActivitySelfCheck(intent)) {
// 查看源码得知 startActivity 最终也会调用 startActivityForResult
super.startActivityForResult(intent, requestCode, options);
}
}
private String mActivityJumpTag;
private long mActivityJumpTime;
/**
* 检查当前 Activity 是否重复跳转了,不需要检查则重写此方法并返回 true 即可
*
* @param intent 用于跳转的 Intent 对象
* @return 检查通过返回true, 检查不通过返回false
*/
protected boolean startActivitySelfCheck(Intent intent) {
// 默认检查通过
boolean result = true;
// 标记对象
String tag;
if (intent.getComponent() != null) { // 显式跳转
tag = intent.getComponent().getClassName();
}else if (intent.getAction() != null) { // 隐式跳转
tag = intent.getAction();
}else {
return result;
}
if (tag.equals(mActivityJumpTag) && mActivityJumpTime >= SystemClock.uptimeMillis() - 500) {
// 检查不通过
result = false;
}
// 记录启动标记和时间
mActivityJumpTag = tag;
mActivityJumpTime = SystemClock.uptimeMillis();
return result;
}
}
网友评论