AOP(Aspect Oriented Programming),即面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP(Object Oriented Programming , 面向对象编程)的延续、补充。利用AOP可以对业务逻辑的各个模块或各个功能进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

这篇文章是接之前的一篇文章《安卓中利用注解生成java代码》

文章目录

  • 为什么使用AOP
  • AOP注解等知识
  • 使用AOP权限检测实践
    • 1,添加插件和使用(这里使用是[apectj](https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx)插件)
    • 2,定义注解类和切面处理类
    • 3,其它模块使用
  • 注意:

为什么使用AOP

其实上面已经大概说了。大家都知道java是面向对象编程的高级语言,面向对象的编程可以使代码模块化、高内聚低耦合,从而方便功能拓展和代码维护,降低开发成本,提高代码质量,甚至提升产品的稳定性。
但是实际的项目开发中必然涉及到一些穿插在各个模块的重复功能,这个功能本身我们可以直接模块化,但是这个功能模块需要在各个其它模块的地方使用,必然会使其它模块产生依赖,影响模块的独立性,比如:安卓权限检测、网络检测、日志输出等。当然不是说模块间调用不可以,只是从开发者角度,这是可以有优化空间的,这个时候就需要面向切面的编程方法了。

AOP注解等知识

注解解释:

@Aspect:声明切面,用来标记类的,可以理解是横切面
@Pointcut(切点表达式):定义切点,标记方法的,切面上的具体的切点//下面的都是统一的切点处理类
@Before(切点表达式):前置通知,切点之前执行
@Around(切点表达式):环绕通知,切点前后执行
@After(切点表达式):后置通知,切点之后执行
@AfterReturning(切点表达式):返回通知,切点方法返回结果之后执行
@AfterThrowing(切点表达式):异常通知,切点抛出异常时执行

JointPoint一些方法(以本文的实例为例):

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String name = signature.getName(); // 方法名:click
Method method = signature.getMethod(); // 方法:click方法信息实体类
Class returnType = signature.getReturnType(); // click返回值类型
Class declaringType = signature.getDeclaringType(); // 方法所在类名:MainActivity
String[] parameterNames = signature.getParameterNames(); // 参数名:activity
Class[] parameterTypes = signature.getParameterTypes(); // 参数类型:Activity
Object[] args = signature.getArgs(); //click里的参数传的值,这里就是一个MainActivity的实体类

使用AOP权限检测实践

1,添加插件和使用(这里使用是apectj插件)

在project的build.gradle中添加:

dependencies {classpath 'com.android.tools.build:gradle:3.3.2'classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.4'// NOTE: Do not place your application dependencies here; they belong// in the individual module build.gradle files
}

在app的build.gradle中添加:

apply plugin: 'com.android.application'
apply plugin: 'android-aspectjx'

2,定义注解类和切面处理类

注解类如下:

/*** 权限检测注解* <p>* <略>** @author : liuxs* @date : 2020/5/15*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)//注意:这里必须使用RetentionPolicy.RUNTIME,如果使用class或者source会在运行时注解消失不起作用
public @interface RequestPermission {/*** 需要申请的权限** @return*/String[] permissions() default {};
}

切面处理类:

/*** 权限切面处理类* <p>* <权限检测统一放这里处理,其它模块如果需要动态权限检测,直接使用注解{@link RequestPermission}>** @author : liuxs* @date : 2020/5/15*/
@Aspect
public class PermissionAspect {@Pointcut("execution(@com.gome.permissionsdemo.RequestPermission * *(..))")public void checkPermissions(){}/*** 这里除了@Around(表示包围了添加了注解的方法),还可以使用** @see org.aspectj.lang.annotation.After   表示添加了注解的方法执行之后执行* @see org.aspectj.lang.annotation.Before  表示添加了注解的方法执行之前执行* @see org.aspectj.lang.annotation.AfterReturning 表示添加了注解的方法执行返回后执行* @see org.aspectj.lang.annotation.AfterThrowing  表示添加了注解的方法执行有异常时执行** @param proceedingJoinPoint*/@Around("checkPermissions()")public void _checkPermissions(final ProceedingJoinPoint proceedingJoinPoint){MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();RequestPermission requestPermission = methodSignature.getMethod().getAnnotation(RequestPermission.class);if(requestPermission == null){return;}String[] permissions = requestPermission.permissions();Object[] args = proceedingJoinPoint.getArgs();if(args == null ||args.length == 0){return;}Activity appCompatActivity = (Activity)args[0];if(args[0] instanceof Activity){EasyPermissions.checkPermissions(appCompatActivity, permissions, new PermissionsCallback() {@Overridepublic void permissionsGranted() {//TODO 授权后执行try {//执行被注解的方法proceedingJoinPoint.proceed();} catch (Throwable throwable) {throwable.printStackTrace();}}@Overridepublic void permissionsDenied() {//TODO 权限拒绝后执行}});}else{}}
}

3,其它模块使用

这里权限申请成功后Toast 获取权限成功

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.hellotv).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {/*EasyPermissions.checkPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA , Manifest.permission.WRITE_EXTERNAL_STORAGE}, new PermissionsCallback() {@Overridepublic void permissionsGranted() {//TODO 授权后执行}@Overridepublic void permissionsDenied() {//TODO 权限拒绝后执行}});*/click(MainActivity.this);}});}@RequestPermission(permissions={Manifest.permission.CAMERA , Manifest.permission.WRITE_EXTERNAL_STORAGE})public void click(Activity activity) {Toast.makeText(MainActivity.this,"获取权限成功",Toast.LENGTH_SHORT).show();}
}

注意:

如果报zip、jar为空,检查一下切面处理类是否有问题,比如:execution拼写错误,写成了executation;execution后面的注解写错了;注解后面的“* *(…)”写错了,第一个(*)代表类,然后空格,然后*代表方法,(…)代表形参。

demo有需要的可以私信获取

又到周末了,世界那么大,人生有那么短,我想出去转转!

安卓Aop 实现权限检测相关推荐

  1. SpringBoot:切面AOP实现权限校验:实例演示与注解全解

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 目录 理解AOP 什么是AOP AOP体系与概念 AOP实例 第一个实例 ...

  2. 安卓实现APP自动检测软件版本并提示更新

    安卓实现APP自动检测软件版本并提示更新 前言 当我们在做安卓项目的时候,客户的需求往往难免会发生变动.但是我们的产品已经上线了,却又需要修改的话我们该怎么办呢?也许很多应用商店已经集成了这个功能,只 ...

  3. 安卓6.0权限处理在项目中的实践

    前言 相关开源项目 使用eclipse和grant开源库权限管理 更新api到23 获得v4包 项目实战开发 默认许可权限无需授权 总结和建议 前言 最近公司的app说装在安卓6.0的系统上程序直接崩 ...

  4. 切面AOP实现权限校验:实例演示与注解全解(强烈推荐)

    点击关注公众号,利用碎片时间学习 1 理解AOP 1.1 什么是AOP AOP(Aspect Oriented Programming),面向切面思想,是Spring的三大核心思想之一(两外两个:IO ...

  5. 【SpringBoot-3】切面AOP实现权限校验:实例演示与注解全解

    SpringBoot中的AOP处理 1 理解AOP 1.1 什么是AOP 1.2 AOP体系与概念 2 AOP实例 2.1 第一个实例 2.2 第二个实例 3 AOP相关注解 3.1 @Pointcu ...

  6. 安卓恶意代码(软件)检测2012-2013年论文研究

    本系列索引链接: 安卓恶意代码(软件)检测2012-2013年论文研究. 由于本次篇幅中的论文都比较老,所以本人就没有细讲也没有进行复现,后续较新的论文我会尝试复现核心模块,与此同时欢迎在做相关研究的 ...

  7. android6.0麦克风权限,android 6.0权限检测以及6.0以下,麦克风、相机权限判断

    android 6.0以上权限 android 6.0以上权限,我是通过PermissionsDispatcher进行申请,操作的,具体使用方法,见PermissionsDispatcher,Andr ...

  8. [异常解决] 安卓6.0权限问题导致老蓝牙程序出现异常解决办法:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission...

    [异常解决] 安卓6.0权限问题导致老蓝牙程序出现异常解决办法:Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission... 参考 ...

  9. php判断目录是否有写的权限,PHP版目录权限检测

    感觉平时代码看的比写的多,一实践起来,就很吃力.这个脚本类似阿d那个吧. -//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...

  10. android 贴身检测,安卓5.0贴身检测怎么设置_安卓贴身检测智能解锁设置方法_飞翔教程...

    安卓5.0贴身检测怎么设置?android 5.0豪华套餐中最新加入了一个名为on-body detection(贴身检测)功能.下面,飞翔铭月分享安卓贴身检测智能解锁设置视频教程,希望能帮助到大家! ...

最新文章

  1. 图森未来完成2.15亿美元D轮融资,将拓展无人驾驶运输服务
  2. 当 JS 工程师遇到了 TypeScript 会发生什么?
  3. JsonObject的依赖
  4. 天气预报Dom解析(转)
  5. oracle segment extent block,Oracle的基础问题segment extent block
  6. ViewState - 页面状态保留
  7. 分治回溯--Nqueen
  8. 游戏史上最伟大的10位制作人(图)
  9. Oracle EBS 值集获取段限定词SQL
  10. Excel2021单元格怎么做下拉菜单
  11. 【GCC】gcc警告选项汇总--编辑中|gcc编译选项
  12. 复利/单利计算程序进度
  13. 原生JavaScript获取某一段时间内的所有日期列表
  14. background-size的几种取值
  15. 最佳编程语言_2020年最佳职业和未来编程语言
  16. 解决程序缺少richtx32.ocx无法运行问题
  17. 动漫景观高清Mac动态壁纸
  18. 【DGL教程】第4章 图数据集
  19. freenom 免费续期
  20. XSS攻击和CSRF攻击(浅显易懂)

热门文章

  1. 信息收集之namp扫描
  2. Android Native Crash的log分析和定位
  3. 梦幻西游热门服务器卡顿延迟,Win10梦幻西游很卡反应很慢该如何处理
  4. 解决win10学习汇编工具的烦恼——汇编学习工具DOSBox0.74的下载和使用(包含可用下载链接)
  5. PLC控制系统设计的基本原则和步骤
  6. 国内外知名PT站点最全汇总,含各站内截图及站点链接【转载】
  7. php给超链接添加图标,图片超链接怎么设置
  8. hsqldb的存储方式
  9. 谷歌无法加载印象笔记剪辑插件
  10. 希尔伯特(Hilbert)空间