Android一秒带你定位当前页面Activity

9,711 阅读4分钟

前言

假设有以下路径

image.png 在过去开发时,我们在点击多层页面的后,想知道当前页面的类名是什么,以上图下单页面为例,我们首先

  • 1、查找首页的搜索酒店按钮的ID
    • XML布局中找到首页的搜索酒店按钮的ID:假设按钮的ID是 R.id.bt_search_hotel
  • 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
    • 在适配器中处理点击事件,示例参数值
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中找到预定按钮的点击事件处理方法,示例参数值
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);
   }
});

上面我们发现存在两个问题:

  1. 在定位Activity这个过程中可能会消耗大量的时间和精力,特别是在页面层级较深或者页面结构较为复杂的情况下。
  2. 我们点击某个属性的时候,有时候想知道当前属性的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;

    }
});

随后我们点击按钮在控制台便可以看到效果

  • 页面埋点

image.png

  • 点击埋点

image.png

总结

  • 是不是很简单呢,只需要简单配置即可1s实现定位当前页面Activity的类名是什么,不需要再花费大量的时间去查找当前页面的类名。
  • 当然,AsmActualCombat项目不仅仅可以实现全埋点、定位当前Activity类名功能,还可以拦截隐私方法调用的拦截哦。
  • 如果大家觉得项目或者文章对你有一点点作用,欢迎点赞收藏哦,非常感谢