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基本用法的资料请关注脚本之家其它相关文章!

相关文章

  • 通过源码角度看看AccessibilityService

    通过源码角度看看AccessibilityService

    这篇文章主要给大家介绍了关于通过源码角度看看AccessibilityService的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • Android游戏源码分享之2048

    Android游戏源码分享之2048

    本文主要是给大家分享了安卓版的游戏2048的源码,以及制作思路,是篇非常不错的文章,有需要的朋友可以参考下
    2014-10-10
  • Android自定义PopWindow实现QQ、微信弹出菜单效果

    Android自定义PopWindow实现QQ、微信弹出菜单效果

    这篇文章主要为大家详细介绍了Android自定义PopWindow实现QQ、微信弹出菜单效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Android自定义顶部标题栏

    Android自定义顶部标题栏

    这篇文章主要为大家详细介绍了Android自定义顶部标题栏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Android使用http实现注册登录功能

    Android使用http实现注册登录功能

    这篇文章主要为大家详细介绍了Android使用http实现注册登录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Android与H5交互产生Script Error踩坑解决

    Android与H5交互产生Script Error踩坑解决

    这篇文章主要为大家介绍了Android与H5交互产生Script Error问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Android开发ProGuard使用技巧掌握

    Android开发ProGuard使用技巧掌握

    这篇文章主要为大家介绍了Android开发ProGuard使用技巧的掌握,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Android Gradle 三方依赖管理详解

    Android Gradle 三方依赖管理详解

    这篇文章主要介绍了Android Gradle 三方依赖管理详解,Gradle的依赖管理是一个从开始接触Android开发就一直伴随着我们的问题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Flutter开发技巧ListView去除水波纹方法示例

    Flutter开发技巧ListView去除水波纹方法示例

    这篇文章主要为大家介绍了Flutter开发技巧ListView去除水波纹方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android Handler leak分析及解决办法详解

    Android Handler leak分析及解决办法详解

    这篇文章主要介绍了Android Handler leak分析及解决办法详解的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论