前言
- 之前兩篇文章我寫了入門篇:Gradle 插件 + ASM 實戰(zhàn)——入門篇和Gradle+ASM實戰(zhàn)——進階篇起趾,對gradle+ASM不熟的大家可以去上篇文章查看
- github地址:https://github.com/Peakmain/AsmActualCombat
需求背景
- 12月底換了新公司译秦,新公司的項目架構需要重構死宣,所以也就有了上篇文章:BasicLibrary——基于kotlin+jetpack+mvvm封裝一套框架威始,提高Android開發(fā)效率
- 同時公司項目在整改隱私政策赞庶,其中有個需求就是當彈出隱私政策胖缤,點擊取消應該進入簡版app而不是直接殺死
- 簡版app其實有很多做法剩燥,一慢逾、直接做個h5,二灭红、限制部分功能侣滩,三、進入首頁变擒,但是點擊任何按鈕彈出需要授權的隱私彈框
- 今天我們主要講第三種方式
解決思路
- 每個點擊按鈕點擊事件之前進行判斷進行攔截
view.setOnClickListener(new OnClickListener() {
public void onClick(View var1) {
//isIntercept()自己設置是否攔截事件
boolean isIntercept =isIntercept();
if(!isIntercept){
return;
}
//原本的事件處理
}
});
- 弊端:弊端其實很明顯君珠,如果有100個點擊事件,需要每個點擊之前都拷貝一份
- 這時候我們就可以考慮用ASM字節(jié)碼插樁娇斑,自動在每個點擊事件之前添加攔截策添,我們只需要需要攔截的時候設置攔截事件就可以
-
直接看我們已經(jīng)做好的ASM編譯后的代碼
image.png
功能介紹
- 可動態(tài)配置是否開啟插件,默認是開啟
- 可動態(tài)設置方法對點擊事件處理之前進行攔截
- 可獲取方法的耗時時間
怎樣使用
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唯竹、動態(tài)設置是否開啟插件
在gradle.properties中設置以下參數(shù),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();
//設置用戶協(xié)議的攔截事件為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格上升,讓你的領導對你刮目相看