手机App中,用户行为统计是非常重要的一部分,如何做到用户行为的统计呢,比较笨的方法是在需要统计的行为,例如朋友圈,语音等的方法的代码中,打印Log,但这样做非常的麻烦,而且工作量很大,那有没有更好的方法呢?答案就是通过AOP,那什么是AOP? AOP是指 Aspect oriented programming,也就是面向切面编程,接下来我将展现一下如何使用AOP进行拥护行为统计,以下是我的项目目录,这里需要一个aspectJrt的jar包。
首先,我们需要编写一个注释类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;
}
}
然后运行项目,当使用相应方法时,Log中打印出来的哪个方法被调用