手机App中,用户行为统计是非常重要的一部分,如何做到用户行为的统计呢,比较笨的方法是在需要统计的行为,例如朋友圈,语音等的方法的代码中,打印Log,但这样做非常的麻烦,而且工作量很大,那有没有更好的方法呢?答案就是通过AOP,那什么是AOP? AOP是指 Aspect oriented programming,也就是面向切面编程,接下来我将展现一下如何使用AOP进行拥护行为统计,以下是我的项目目录,这里需要一个aspectJrt的jar包。

AOP架构的简单使用_架构

这里写图片描述

首先,我们需要编写一个注释类BehaviorTrace,用来标识方法是否要被追踪,统计

//用来标识方法是否要被追踪,统计
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BehaviorTrace {
    String value();
}

接着就给我们需要统计的方法进行注释
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @BehaviorTrace("摇一摇")
    public void play1(View view) {

        Log.i("MainActivity", "摇一摇被使用了");
        SystemClock.sleep(30);

    }
    @BehaviorTrace("语音")
    public void play2(View view) {

        int beginTime = TimeUtils.begin();
        SystemClock.sleep(30);
        /*TimeUtils.end(beginTime, "play2");*/

    }

    @BehaviorTrace("视频通话")
    public void play3(View view) {

        int beginTime = TimeUtils.begin();
        SystemClock.sleep(30);
        /*TimeUtils.end(beginTime, "play3");*/

    }

    @BehaviorTrace("商城")
    public void play4(View view) {

        int beginTime = TimeUtils.begin();
        SystemClock.sleep(30);
        /*TimeUtils.end(beginTime, "play4");*/

    }

    public void jumpToFriend(View view) {
        Intent i = new Intent(this,FriendActivity.class);
        startActivity(i);

    }

}

编写用户行为切面

//用户行为的切面
@Aspect
public class BehaviorAspect {
    // 带有BehaviorTrace的方法构成了这个切面
    @Pointcut("execution(@com.example.aopdemo.BehaviorTrace * *(..))")
    public void annoHaviorTrace() {

    }

    @Around("annoHaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint
                .getSignature();
        // 类名
        String className = methodSignature.getDeclaringType().getSimpleName();
        // 方法名
        String mtdName = methodSignature.getName();
        // 功能名
        BehaviorTrace behaviorTrace = methodSignature.getMethod()
                .getAnnotation(BehaviorTrace.class);
        String fun = behaviorTrace.value();

        long begin = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        //方法执行后
        long duration = System.currentTimeMillis() - begin;
        Log.d("AOP", String.format("功能:%s功能,%s的%s方法执行,耗时:%d ms ", fun,
                className, mtdName, duration));

        return result;
    }
}

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2023最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔