作者简介 原创微信公众号郭霖 WeChat ID: guolin_blog

新的一周开始了,大家早上好!

本篇来自Single Shu888的投稿,分享了如何在Android中实现面向切面编程,希望能对大家有所帮助。

Single Shu888的博客地址:

http://blog.csdn.net/sw5131899

正文

Android的博大精深,不是一言两语能够说明道清的,它的魅力只有亲身去接触才能体会。就像美女一样:

我先在这里申明一下,我这篇 AOP 只是学习笔记,适合入门级选手,如果阁下是大神想要参考 AOP,那么我给个我认为写的很好的 AOP 链接:

http://blog.csdn.net/innost/article/details/49387395

我就是参照他的博客和官网例子学习的。

那么我们先来说说什么是 AOP。说到 AOP 也许不太了解,那么 OOP 一定是知道的。Object-Oriented Progreming面向对象编程。学Java基础的时候肯定都都会学面向对象思想和三大特性。这里就不详细介绍了。

AOP 是Aspect-Oriented Progreming的缩写,在 OOP 设计中有个单一职责原则,在很多时候都不会有问题,但是当很多模块都需要同一个功能的时候,这个时候还用 OOP 就会很麻烦。那么 AOP 在Android中的应用就应运而生。

那么先从搭环境开始吧,待会会把 aspectJ 的jar包放在Git上,下载1.8.5.jar包之后,安装在电脑上。直接点安装即可。

下一步下一步就好。这里我只介绍 Android Studio 的。Eclipse 也是可以使用的。Studio 就好配置了,在 Gradle 中进行配置。贴一下我的 Gradle 配置:

至于为什么这么配置,AspectJ 是对java的扩展,而且是完全兼容java的。但是编译时得用 Aspect 专门的编译器,这里的配置就是使用 Aspect 的编译器。这里还在 libs 导入了一个jar包。创建依赖。

好啦,所有准备工作已完成。那么拿着梭子就是干,别想那么多了。上车吧!

AOP很多是拿来做用户行为统计和性能检测的。那我这里写一个手机权限检测的使用方法。

首先创建一个类,用来处理触发切面的回调:

这里要使用Aspect的编译器编译必须给类打上标注,@Aspect

还有这里的 Pointcut 注解,就是切点,即触发该类的条件。里面的字符串都有哪些呢。让我们来看看:

在我的例子中,我使用了 execution,也就是以方法执行时为切点,触发 Aspect类。而 execution 里面的字符串是触发条件,也是具体的切点。我来解释一下参数的构成。“execution(@com.example.administrator.aspectjdemo.AspectJAnnotation  * *(..)” 这个条件是所有加了 AspectJAnnotation 注解的方法或属性都会是切点,范围比较广。

**:表示是任意包名

..:表示任意类型任意多个参数

com.example.administrator.aspectjdemo.AspectJAnnotation:这是我的项目包名下需要指定类的绝对路径

那知道了这些基本上就能定义自己想要的切点了。比如我只想在 MainActivity 的 onCreate() 方法执行时作为切点。那么字符串应该是 “* com.example.administrator.aspectjdemo.MainActivity.onCreate(..)”,那么这个切点就很明确,只有一个。

不同的切点可以用与或来连接。看清楚哦,前面有个*号。因为 onCreate 方法时编译时执行,所以在回调时传入的参数必须是父类 JoinPoint。上面除了 execution 还有其他很多切点类型。比如 call方法 回调时,get 和 set 分别是获取和执行时。等等,就不举例了。

再来看看 @Around,Around 是指 JPoint 执行前或执行后备触发,而 around 就替代了原 JPoint。除了 Around 还有其他几种方式。

这里的说明和示例大家看看就大概明白什么意思了,具体怎么使用还是亲自去实践才行的。

回到我们的例子上来,创建完 Aspect类 之后,还需要一个注解类来做笔,哪里需要做切点,那么哪里就用注解标注一下,这样方便快捷。解决了 OOP 的单一原则问题。

注解其实很简单的,里面的类型并不多。想要了解的童鞋我下篇文章做个学习笔记,大家一起学习一下。

在哪使用呢。方法名和属性名上都可以。

text() 方法执行时就是一个切点。在执行 test 时,会回调上面的 Aspect类 的 executionAspectJ() 方法。然后会依次执行 @Before,@After。至于 After 和 Around 谁先谁后,这个我不太清楚,如果两个都写的话会报错。所以不知先后。有兴趣的可以自己试试。那么我们再看看 aroundAspectJ(ProceedingJoinPoint joinPoint) 这个方法里的逻辑。

如果使用的是以方法相关为切点,那么使用 MethodSignature 来接收 joinPoint 的 Signature。如果是属性或其他的,那么可以使用 Signature类 来接收。之后可以使用 Signature 来获取注解类。通过注解可以拿到需要检测的权限名称。但是检测权限又需要上下文,那么通过 jointPoint.getThis() 获取使用该注解的 Activity 的上下文,至于 Fragment 的我还没试过,有兴趣的自己试试。那么我们再来看看 PermissionManager 这个类。

在这个类我试验了一下两种单例模式的性能差别,刚都说了AOP可以用来检测性能嘛。不过没在高并发的环境下其实两种都差不多。

ContextCompat.checkSelfPermission(context,permission) == PackageManager.PERMISSION_GRANTED 这句代码是检测权限。Android提供的类,可以直接使用。那么到这里思路差不多清晰了。以后想要做用户行为统计,或是性能检测,亦或是权限或者用户权限管理,AOP都是你的不二之选。

最后项目地址:

https://github.com/SingleShu/AspectJDemo

完。。。。。。。。。。。。。。。。。。。。。

文章原创作者GuoLin 书籍推荐

郭林大神原创android 书籍:《第一行代码 android》

淘宝链接: https://s.click.taobao.com/t?e=m%3D2%26s%3DgKUfuKdAZKocQipKwQzePOeEDrYVVa64K7Vc7tFgwiHjf2vlNIV67p2n%2BQBNMyE6Rku8%2Bpj6eJall3bs%2B3NRhNHnsKI%2BqxhyM0iVZhTFBom4YIorMPnmg8G0g2OJi%2FzmXHfenomYtn5EW9vzeG8LzfPUwktUBEmkxg5p7bh%2BFbQ%3D&pvid=10_106.6.161.154_3367_1490163222155

更多相关文章

  1. adb monkey(详细分析)
  2. Android(安卓)两种启动Service(远程)的方式:Bind 与Start
  3. iOS学习――iOS应用程序生命周期(四)
  4. 6. Android(安卓)MultiMedia框架完全解析 - NuPlayerDriver与NuP
  5. Android单元测试-Robolectric 浅析
  6. 「Android」Android开发你需要知道的注解(Annotation)
  7. Android中的自定义注解(反射实现-运行时注解)
  8. Timer、TimerTask的简单应用及如何解决多次调度相同任务。
  9. Android在子线程更新UI主线程的6种方法

随机推荐

  1. Android(安卓)OpenGL例子学习
  2. 在AndroidManifest.xml文件中的android:w
  3. android获取短信所有内容
  4. Android: 系统默认音量
  5. Android逆向分析常用网站
  6. Android中常用的Intent.Action整理
  7. android(2.0以后版本) 中读取联系人和通
  8. 更新SDK后eclipse报错This Android(安卓)
  9. Android(安卓)NDK 开发
  10. android之android.os.NetworkOnMainThrea