android AOP面向切面编程 aspectjrt 。

在android项目中我们有很多这样的需求,在很多地方要去判断一些有无登录的操作,比方说点击个人中心。在淘宝中点击购物车,如果没有登录,我们需要先跳转,到登录页面去登录。又比方说,有些地方,我们需要做一些网络的判断。这样,很多地方都需要写很多的if else。今天给大家带来一个很解决方案AspectJ。一个注解就搞定。省去很多的if else,

介绍:

AspectJ是一个面向切面编程的框架。AspectJ是对java的扩展,而且是完全兼容java的,AspectJ定义了AOP语法,它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。AspectJ还支持原生的Java,只需要加上AspectJ提供的注解即可。在Android开发中,一般就用它提供的注解和一些简单的语法就可以实现绝大部分功能上的需求了。

 

 

  • 1. AspectJ框架 配置
  • 2.模仿淘宝登录

1. AspectJ框架 配置

先在app  build.gradle  引入 AspectJ

   

  implementation 'org.aspectj:aspectjrt:1.9.4'

aspectjrt:1.9.4  最低支持安卓 24

   在项目的build.gradle中进行配置

​
buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.1'
        classpath 'org.aspectj:aspectjtools:1.9.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

​

2.模仿淘宝登录

登录注解

 

​
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsLogin {
    String value();
}

​

切入点处理

 

@Aspect
public class BehaviorTraceAspect {

    @Pointcut("execution(@com.example.administrator.aoptest.annotation.IsLogin *  *(..))")
    public void methodAnnottatedWithBehaviorTrace() {
    }

    @Around("methodAnnottatedWithBehaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        Context context= (Context) joinPoint.getThis();
        if (SettingsPerf.getLonginStatus(context)){//判断是否登录,登录成功执行MainAcitity onClick 中的跳转
            Object result = joinPoint.proceed();  //执行注解的方法
            return  result;
        }else {//没有登录,不去执行注解的方法
            Intent intent=new Intent(context,LoginActivity.class);
            context.startActivity(intent);
            return null;
        }
    }

}

@Pointcut 是切入 点 , 所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义  

     execution(@com.example.administrator.aoptest.annotation.IsLogin * *(..))"  

     表示com.example.administrator.aoptest.annotation 包下所有注解了 IsLogin  的类的方法,进行拦截。

 

@Around   环绕通知, 在目标执行中执行通知, 控制目标执行时机  ,相对应的还有@Before,@After,

使用注解
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @IsLogin("登录")
    public void onClick(View view) {
        Intent intent=new Intent(this,UserCenterActivity.class);
        startActivity(intent);
    }
}

以上完成。

源码下载 https://download.csdn.net/download/tong6320555/11452235

 

  

 

   

 

 

 

 

 

你可能感兴趣的:(架构)