【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