前言
- 之前两篇文章我写了入门篇:Gradle 插件 + ASM 实战——入门篇和Gradle+ASM实战——进阶篇,对gradle+ASM不熟的大家可以去上篇文章查看
- github地址:https://github.com/Peakmain/AsmActualCombat
需求背景
- 12月底换了新公司,新公司的项目架构需要重构,所以也就有了上篇文章:BasicLibrary——基于kotlin+jetpack+mvvm封装一套框架,提高Android开发效率
- 同时公司项目在整改隐私政策,其中有个需求就是当弹出隐私政策,点击取消应该进入简版app而不是直接杀死
- 简版app其实有很多做法,一、直接做个h5,二、限制部分功能,三、进入首页,但是点击任何按钮弹出需要授权的隐私弹框
- 今天我们主要讲第三种方式
解决思路
- 每个点击按钮点击事件之前进行判断进行拦截
view.setOnClickListener(new OnClickListener() {
public void onClick(View var1) {
//isIntercept()自己设置是否拦截事件
boolean isIntercept =isIntercept();
if(!isIntercept){
return;
}
//原本的事件处理
}
});
- 弊端:弊端其实很明显,如果有100个点击事件,需要每个点击之前都拷贝一份
- 这时候我们就可以考虑用ASM字节码插桩,自动在每个点击事件之前添加拦截,我们只需要需要拦截的时候设置拦截事件就可以
-
直接看我们已经做好的ASM编译后的代码
功能介绍
- 可动态配置是否开启插件,默认是开启
- 可动态设置方法对点击事件处理之前进行拦截
- 可获取方法的耗时时间
怎样使用
ASM插件依赖
Add it in your root build.gradle at the end of repositories:
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "io.github.peakmain:plugin:1.0.0"
}
}
apply plugin: "com.peakmain.plugin"
拦截事件sdk的依赖
- Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Step 2. Add the dependency
dependencies {
implementation 'com.github.Peakmain:AsmActualCombat:0.1.10'
}
使用文档
- 1、Application中初始化
SensorsDataAPI.init(this);
- 2、动态设置是否开启插件
在gradle.properties中设置以下参数,false代表不关闭插件,true表示关闭插件,默认是false
peakmainPlugin.disableAppClick=false
- 3、在要拦截的页面设置拦截事件
SensorsDataAPI.getInstance().setOnUserAgreementListener(new SensorsDataAPI.OnUserAgreementListener() {
@Override
public boolean onUserAgreement() {
}
})
完整的举例代码如下:
private void setUserAgreementListener(Activity activity) {
isAcceptUserPrivacy = (Boolean) PreferencesUtils.getInstance(this).getParam(Constants.HAS_ACCEPT_USER_PRIVACY, false);
SensorsDataAPI.getInstance().setOnUserAgreementListener(new SensorsDataAPI.OnUserAgreementListener() {
@Override
public boolean onUserAgreement() {
if (!isAcceptUserPrivacy) {
//没有同意
AlertDialog dialog = new AlertDialog.Builder(activity)
.setContentView(R.layout.dialog_user_agreement)
.setCancelable(false)//点击空白不可取消
.show();
//设置用户协议的拦截事件为NULL
SensorsDataAPI.getInstance().setOnUserAgreementListener(null);
dialog.setOnClickListener(R.id.stv_refuse, v -> {
//取消按钮的点击事件
dialog.dismiss();
setUserAgreementListener(activity);
});
dialog.setOnClickListener(R.id.stv_agreement, v -> {
//同意按钮的点击事件
com.peakmain.ui.utils.ToastUtils.showLong("同意了");
PreferencesUtils.getInstance(activity).saveParams(Constants.HAS_ACCEPT_USER_PRIVACY, true);
dialog.dismiss();
});
}
return isAcceptUserPrivacy;
}
});
- 4、获取方法耗时时间
在需要获取耗时时间的方法上方添加以下注解
@LogMessageTime
总结
- 使用起来还是很方便的,如果大家也有相关需求:希望在点击事件处理事情之前进行相关代码拦截,都可以使用这个库
- 当然,大家最好自己下下来,在自己的项目中跑跑,然后改成自己的,可以直接让自己的B格上升,让你的领导对你刮目相看