天天看點

AOP架構的簡單使用

手機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;
    }
}           

複制

然後運作項目,當使用相應方法時,Log中列印出來的哪個方法被調用