前言
假设有以下路径
在过去开发时,我们在点击多层页面的后,想知道当前页面的类名是什么,以上图下单页面为例,我们首先
- 1、查找首页的搜索酒店按钮的ID
- XML布局中找到首页的搜索酒店按钮的ID:假设按钮的ID是
R.id.bt_search_hotel
- XML布局中找到首页的搜索酒店按钮的ID:假设按钮的ID是
- 2、从首页Activity中查找按钮的点击事件
- 假设你有一个点击事件处理器方法
onSearchHotelClick(View view)
,你可以在首页Activity中找到这个方法的实现
- 假设你有一个点击事件处理器方法
- 3、进入下一个酒店列表页面Activity
- 在点击事件处理方法中,启动酒店列表页面的Activity,示例参数值:
Intent intent = new Intent(this, HotelListActivity.class);
startActivity(intent);
- 4、若多个RecyclerView,需要找到RecyclerView的ID,并在适配器中处理点击事件
- 在酒店列表页面的XML布局中找到RecyclerView的ID:假设RecyclerView的ID是
R.id.rvHotel
。 - 在适配器中处理点击事件,示例参数值
- 在酒店列表页面的XML布局中找到RecyclerView的ID:假设RecyclerView的ID是
rvHotel.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
// 处理点击事件,启动酒店详情页面的Activity
Intent intent = new Intent(context, HotelDetailActivity.class);
intent.putExtra("hotel_id", hotelList.get(position).getId());
startActivity(intent);
}
});
- 在酒店详情页面中找到XML中预定按钮的ID,并处理点击事件:
- 在酒店详情页面的XML布局中找到预定按钮的ID:假设按钮的ID是
R.id.stv_book
- 在详情页面Activity中找到预定按钮的点击事件处理方法,示例参数值
- 在酒店详情页面的XML布局中找到预定按钮的ID:假设按钮的ID是
Button bookButton = findViewById(R.id.bookButton);
bookButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 处理点击事件,启动下单页面的Activity
Intent intent = new Intent(DetailActivity.this, OrderActivity.class);
startActivity(intent);
}
});
上面我们发现存在两个问题:
- 在定位Activity这个过程中可能会消耗大量的时间和精力,特别是在页面层级较深或者页面结构较为复杂的情况下。
- 我们点击某个属性的时候,有时候想知道当前属性的id是什么,然后去做一些逻辑或者赋值等,我们只能去找布局,如果布局层次深,又会浪费大量的时间去定位属性
如果我们能够在1s
快速准确地获取当前Activity的类名,那么在项目开发过程中将起到关键性作用,节省了大量时间,减少了开发中的冗余工作。开发人员的开发流程将更加高效,能更专注于业务逻辑和功能实现,而不用花费过多时间在页面和属性定位上
为什么要实现一秒定位当前页面Activity
- 优化了Android应用程序的性能,实现了快速的页面定位,将当前Activity的定位时间从秒级缩短至仅1秒
- 提高了开发效率,允许团队快速切换页面和快速查找当前页面的类名,减少了不必要的开发时间浪费
- 这一优化对项目推进产生了显著影响,提高了整体开发流程的高效性,使我们能够更专注于业务逻辑的实现和功能开发
使用的库是:AsmActualCombat
- AsmActual利用ASM技术将合规插件会侵入到编译流程中, 插件会把App中所有系统敏感API或属性替换为SDK的收口方法 , 从而解决直接使用系统方法时面临的隐私合规问题
AsmActualCombat库的使用
使用文档链接:github.com/Peakmain/As…
How To
旧版本添加方式
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.1.4"
}
}
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:1.1.5'
}
新版本添加方式
settings.gradle
pluginManagement {
repositories {
//插件依赖
maven {
url "https://plugins.gradle.org/m2/"
}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
//sdk仓库
maven { url 'https://jitpack.io' }
}
}
插件依赖
根目录下的build.gradle文件
plugins {
//插件依赖和版本
id "io.github.peakmain" version "1.1.4" apply false
}
sdk版本依赖
implementation 'com.github.Peakmain:AsmActualCombat:1.1.5'
app.build中开启打印
monitorPlugin {
whiteList = [//设置白名单
"com.peakmain.asmactualcombat.utils.TestUtils",
"com.peakmain.plugin"
]
methodStatus = 1//1代表方法体替换,其他都是正常情况
enableLog=true//是否开启日志打印,默认不打印
}
使用
我们只需要在application的时候调用以下即可
SensorsDataAPI.init(this);
SensorsDataAPI.getInstance().setOnUploadSensorsDataListener((state, data) -> {
switch (state) {
case SensorsDataConstants.APP_START_EVENT_STATE:
//$AppStart事件
case SensorsDataConstants.APP_END__EVENT_STATE:
//$AppViewScreen事件
break;
case SensorsDataConstants.APP_VIEW_SCREEN__EVENT_STATE:
if (BuildConfig.DEBUG) {
Log.e("TAG", data);
}
StatisticsUtils.statisticsViewHeader(
GsonUtils.getGson().fromJson(data, SensorsEventBean.class));
break;
case SensorsDataConstants.APP_VIEW_CLICK__EVENT_STATE:
if (BuildConfig.DEBUG) {
Log.e("TAG", data);
}
SensorsEventBean sensorsEventBean =
GsonUtils.getGson().fromJson(data, SensorsEventBean.class);
StatisticsUtils.statisticsClickHeader(sensorsEventBean);
break;
default:
break;
}
});
随后我们点击按钮在控制台便可以看到效果
- 页面埋点
- 点击埋点
总结
- 是不是很简单呢,只需要简单配置即可1s实现定位当前页面Activity的类名是什么,不需要再花费大量的时间去查找当前页面的类名。
- 当然,AsmActualCombat项目不仅仅可以实现全埋点、定位当前Activity类名功能,还可以拦截隐私方法调用的拦截哦。
- 如果大家觉得项目或者文章对你有一点点作用,欢迎点赞收藏哦,非常感谢