手機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中列印出來的哪個方法被調用