Android AOP基本用法全面详解

 更新时间:2023年09月12日 11:50:46   作者:搬砖的兔子  
这篇文章主要为大家介绍了Android AOP基本用法全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是AOP

AOP(Aspect Oriented Programming)意为面向切面编程,指通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。

其广泛的应用在代码的后期修改与维护之中,它对原代码侵入性少,容易扩展辅助功能,可以使原执行逻辑与改变执行逻辑解耦。

现在有一个智能门,以前的开门的逻辑是:输入密码 -> 拎动把手 -> 开门,现在呢业主觉得密码有可能被盗,不够安全,希望加上指纹验证。这时候我们只需要将 验证指纹 这一步插入到 开门 之前就完成了,现在的逻辑是:输入密码 -> 拎动把手 -> 指纹验证 -> 开门。这种思维就是一种面向切面的思维。

什么是AspectJ

要知道AOP只是一种编程思想,那么,在android中,我们该通过何种工具来实现这种思想呢,没错,就是AspectJ。要掌握AspectJ首先要明确下面的几大概念:

Advice(通知):定义需要被注入到.class字节码文件中的代码,通俗点儿来说就是告诉编织器哪里是你需要插入的代码。

  • @Pointcut :定义切点、标记方法以便于重用。
  • @Before :前置通知,其内容在切点之前执行。
  • @Around :环绕通知,其内容贯穿整个切点前后。
  • @After:后置通知,其内容在切点之后执行。
  • @AfterReturning:返回通知,其内容在切点返回结果后再执行。
  • @AfterThrowing:异常通知,其内容在切点抛出异常时执行。

JoinPoint(连接点):即允许你插入代码的地方。

Pointcut(切入点):是对连接点的筛选与定义的一种表达式。

  • 如下图所示,"execution(* android.view.View.OnClickListener.onClick(..))"是一个完整的切点表达式,它是由execution(<修饰符模式>? <返回类型模式> <方法名模式>(<参数模式>) <异常模式>?)组成的,其中<修饰符模式>和<异常模式>可以省略。

Aspect(切面):切面是通知和切入点的结合。

Weaving(织入):这个很好理解就是把我们定义好的切面注入到目标对象中去的过程。

基本用法

插件配置

//在根build.gradle下配置:
dependencies {
    ...
    classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8' 
}
//在app/build.gradle下配置
apply plugin: 'com.hujiang.android-aspectjx'
aspectjx {
    //关闭AspectJX功能
    enabled true
    //织入遍历符合条件的库
    //includeJarFilter 'universal-image-loader', 'AspectJX-Demo/library'
    //排除包含‘universal-image-loader'的库
    //excludeJarFilter 'universal-image-loader'
}

定义切面

创建一个类,并通过@Aspect定义为一个切面。

@Aspect
public class AspectTest {
    ......
}

创建通知、添加切点表达式

在该类中添加需要编织的方法,并通过通知和切点表达式来定义它。Ok,一个简单的防抖的OnClick判断就切入到你的程序中去了。相信其他业务你也能很好的利用AspectJ来处理了。

@Aspect
public class AspectTest {
    private static final String TAG = "AspectTest";
    @Around("execution(* android.view.View.OnClickListener.onClick(..))")
    public void onClickListener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        Log.d(TAG, "onClick");
        if (!NoDoubleClickUtils.isDoubleClick()){
            proceedingJoinPoint.proceed();    //切回到切点并执行后续代码
        }
    }
}

补充:第三方库兼容

有时候我们在使用AspectJ的时候可能会遇到引入了一些其他的三方库的情况,而我们又需要对其内的连接点进行编织、切入。如上述点击事件防抖的例子,可能用到了Butterknife来注解@onClick(),这时你会发现上述切入表达式不起作用了,为什么呢,我们看一下Butterknife中的@OnClick定义就知道了。

@Target(METHOD)
@Retention(RUNTIME)
@ListenerClass(
    targetType = "android.view.View",
    setter = "setOnClickListener",
    type = "butterknife.internal.DebouncingOnClickListener",
    method = @ListenerMethod(
        name = "doClick",
        parameters = "android.view.View"
    )
)
public @interface OnClick {
  /** View IDs to which the method will be bound. */
  @IdRes int[] value() default { View.NO_ID };
}

我们可以发现。其通过Annotation Processor对@OnClick进行扫描,并将android.view.View.OnClickListener.onClick方法替换为butterknife.internal.DebouncingOnClickListener.doClick方法。因此为了兼容ButterKnife上述切入点表达式应该改为如下方式,及对butterknife的OnClick方法进行切入。

@Around("execution(* android.view.View.OnClickListener.onClick(..)) || execution(@butterknife.OnClick * *(..))")
public void onClickListener(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
    Log.d(TAG, "onClick");
    if (!NoDoubleClickUtils.isDoubleClick()){
        proceedingJoinPoint.proceed();
    }
}

以上就是Android AOP基本用法全面详解的详细内容,更多关于Android AOP基本用法的资料请关注脚本之家其它相关文章!

相关文章

  • Android 如何采用Lame编码器编码mp3文件

    Android 如何采用Lame编码器编码mp3文件

    这篇文章主要介绍了Android 如何采用Lame编码器编码mp3文件,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-03-03
  • Android 使用gradle打包Assets目录的案例

    Android 使用gradle打包Assets目录的案例

    这篇文章主要介绍了Android 使用gradle打包Assets目录的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Kotlin fun函数使用方法

    Kotlin fun函数使用方法

    函数是执行特定任务的一组相互关联的代码块。函数用于将程序分解为不同的子模块。它使代码可重用,并使程序更易于管理,这篇文章主要介绍了Kotlin fun函数使用方法
    2022-12-12
  • Android监听输入法弹窗和关闭的实现方法

    Android监听输入法弹窗和关闭的实现方法

    用过ios的都知道ios上输入法关闭的同时会自动关闭输入框,那么在android上如何实现监听输入法弹出和关闭呢?接下来通过本文给大家分享一种可靠的实现方式
    2016-11-11
  • android编程之XML文件解析方法详解(附源码)

    android编程之XML文件解析方法详解(附源码)

    这篇文章主要介绍了android编程之XML文件解析方法,结合实例形式较为详细的分析了Android解析XML文件的sax、pull及Dom三种方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • 基于Android studio3.6的JNI教程之ncnn之语义分割ENet

    基于Android studio3.6的JNI教程之ncnn之语义分割ENet

    这篇文章主要介绍了基于Android studio3.6的JNI教程之ncnn之语义分割ENet的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2020-03-03
  • 解析:继承ViewGroup后的子类如何重写onMeasure方法

    解析:继承ViewGroup后的子类如何重写onMeasure方法

    本篇文章是对继承ViewGroup后的子类如何重写onMeasure方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Kotlin 协程 supervisorScope {} 运行崩溃解决方法

    Kotlin 协程 supervisorScope {} 运行崩溃解决方法

    看过很多 supervisorScope {} 文档的使用,我照抄一摸一样的代码,运行就崩溃,最后找到了解决方法,应该是kotlin版本更新做过改动,当前我使用的是 androidx.core:core-ktx:1.9.0,本文给大家介绍Kotlin 协程 supervisorScope {} 运行崩溃解决方法,感兴趣的朋友一起看看吧
    2024-01-01
  • Android应用中图片浏览时实现自动切换功能的方法详解

    Android应用中图片浏览时实现自动切换功能的方法详解

    这篇文章主要介绍了Android应用中图片浏览时实现自动切换功能的方法,文中还讲解了一个触摸大图进行图片切换的深入功能,需要的朋友可以参考下
    2016-04-04
  • Android三种双屏异显实现方法介绍

    Android三种双屏异显实现方法介绍

    现在越来越多的Android设备有多个屏幕,双屏异显应用场景最多的应该就是类似于收银平台那种设备,在主屏上店员能够对点商品进行选择录入,副屏则是展示给我们的账单详情,但是它只通过了一个软件系统就实现了双屏异显这个功能,而Presentation正是这其中的关键
    2023-01-01

最新评论