【Android AOP--01】Android使用Aspect

作者: 唠嗑008 | 来源:发表于2018-09-15 10:47 被阅读17次

前言

小伙伴们,大家好,我是唠嗑,很长时间没有更新Android系列文章了,最近研究了一下AOP,觉得很有意思,也很实用,所以打算写一个关于AOP的系列文章,和大家一起探讨学习。

其实在去年,我就在项目中用过了一次AOP,大家可以看看。
Android AOP面向切面编程详解

接下来就带小伙伴学习一下,如何在你的项目中使用AOP。

使用AOP,是需要做一大堆配置的,为了方便,我们使用沪江同学的开源项目AspectJhttps://github.com/HujiangTechnology/gradle_plugin_android_aspectjx

使用步骤

1、在项目的根目录的build.gradle中添加如下依赖

dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

2、在app.gradle中添加如下

apply plugin: 'android-aspectjx'
//或者这样也可以
apply plugin: 'com.hujiang.android-aspectjx'

dependencies {
    //aspectjrt的依赖
    compile 'org.aspectj:aspectjrt:1.8.9'
}

到这里,配置就算完成了。这是我目前使用过的最简单的配置了。


通过一个小例子来讲解

平时我们经常会用到Log日志,比如在Activity的所有生命周期的方法中加一条Log。

下面一起来看看通过AOP是如何实现的。
创建一个AspectTest类

@Aspect
public class AspectTest {
    final String TAG = AspectTest.class.getSimpleName();

    /**
     * 在MainActivity的所有生命周期的方法中打印log
     * @param joinPoint
     * @throws Throwable
     */
    @Before("execution(* *..MainActivity+.on**(..))")
    public void method(JoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = joinPoint.getThis().getClass().getSimpleName();

        Log.e(TAG, "class:" + className);
        Log.e(TAG, "method:" + methodSignature.getName());
    }

}

注视详解:

  • @Aspect注解:标示这是一个切面类
  • @Before:可以在方法后插入代码

MainActivity
只需要添加生命周期的几个方法即可。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

看看打印结果


怎么样?很简洁方便吧。用AOP一个最大的好处是:在不入侵原有代码的情况下,可以对同一功能统一处理,比如检查登录,检查权限,防止按钮二次点击等。

相关文章

网友评论

  • tmyzh:下面这个demo 实践的时候没有成功 没有对应的打印 不知道什么原因

本文标题:【Android AOP--01】Android使用Aspect

本文链接:https://www.haomeiwen.com/subject/datagftx.html