前言
小伙伴们,大家好,我是唠嗑,很长时间没有更新Android系列文章了,最近研究了一下AOP,觉得很有意思,也很实用,所以打算写一个关于AOP的系列文章,和大家一起探讨学习。
其实在去年,我就在项目中用过了一次AOP,大家可以看看。
Android AOP面向切面编程详解
接下来就带小伙伴学习一下,如何在你的项目中使用AOP。
使用AOP,是需要做一大堆配置的,为了方便,我们使用沪江同学的开源项目AspectJ
https://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一个最大的好处是:在不入侵原有代码的情况下,可以对同一功能统一处理,比如检查登录,检查权限,防止按钮二次点击等。
网友评论