美文网首页
AndroidStudio中使用AndroidAnnotatio

AndroidStudio中使用AndroidAnnotatio

作者: 牵着1只蜗牛去散步 | 来源:发表于2017-11-28 15:22 被阅读10次

    简介

    1、配置环境变量

    1、在project的build.gradle中添加如下代码:

    dependencies {
        -------
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4+'
    }
    

    2、在app的build.gradle中添加如下代码:

    apply plugin: 'com.android.application'
    //annotations注解
    apply plugin: 'android-apt'
    def AAVersion = '3.3.2'
    ---
    // 注解框架
    apt {
        arguments {
            androidManifestFile variant.outputs[0].processResources.manifestFile
            resourcePackageName '程序的包名'
        }
    }
    dependencies {
        ---
        //annotations註解
        apt "org.androidannotations:androidannotations:$AAVersion"
        compile "org.androidannotations:androidannotations-api:$AAVersion"
    }
    

    2、示例代码

    示例代码1

    @EActivity(R.layout.translate) // Sets content view to R.layout.translate
    public class TranslateActivity extends Activity {
    
        @ViewById // Injects R.id.textInput 
        EditText textInput;  // 使用注解变量不能被private修饰 
    
        @ViewById(R.id.myTextView) // Injects R.id.myTextView
        TextView result;
    
        @AnimationRes // Injects android.R.anim.fade_in
        Animation fadeIn;
    
        @StringRes(R.string.hello) // 检索String资源文件
        String myHelloString;
        
        @StringRes
        String hello;
    
        @ColorRes(R.color.backgroundColor) // 检索Color资源文件
        int someColor;
    
        @ColorRes
        int backgroundColor;
    
        @DimensionRes(R.dimen.fontsize) // 检索dimension 资源
        float fontSizeDimension;
    
        @DimensionRes
        float fontsize;
    
        // @DimensionPixelOffsetRes 注解用来检索dimension 资源。
        // 获得一个以整型的像素偏移量为最终值的dimension 。这个注解功能和@DimensionRes一样,除了原始浮点数被截断成一个整型(像素)值。
        @DimensionPixelOffsetRes(R.string.fontsize)
        int fontSizeDimension;
    
        @DimensionPixelOffsetRes
        int fontsize;
    
        // @DimensionPixelSizeRes注解用来检索dimension 资源。
        //获得一个以整型的像素大小为最终值的dimension 。
        //这个注解功能和@DimensionRes一样,除了原始浮点数被截断成一个整型(像素)值作为大小值。
        //大小转换涉及到基值舍入,确保一个非零的基值至少有1像素的大小。
    
        @DimensionPixelSizeRes(R.string.fontsize)
        int fontSizeDimension;
    
        @DimensionPixelSizeRes
        int fontsize;
    
        @Click // When R.id.doTranslate button is clicked 按钮的点击事件
        void doTranslate() {
             translateInBackground(textInput.getText().toString());
        }
    
        @Background // Executed in a background thread 后台线程中执行的代码
        void translateInBackground(String textToTranslate) {
             String translatedText = callGoogleTranslate(textToTranslate);
             showResult(translatedText);
        }
       
        @UiThread // Executed in the ui thread 主线程中执行的代码
        void showResult(String translatedText) {
             result.setText(translatedText);
             result.startAnimation(fadeIn);
        }
    
        // [...]
    }
    

    示例代码2

    //Eactivity注释可以设置Layout,相当于setConentView方法
    @EActivity(R.layout.activity_main)
    @Fullscreen // 全屏
    @NoTitle
    public class MainActivity extends Activity {
        //ViewById注释功能与findViewById相同,如果声明的变量名就是id,可以省去参数,否则应加上id,如ViewById(R.id.tv)
        
        @ViewById
        TextView tv;
        @ViewById
        EditText edit;
        @StringRes(R.string.hello_world)
        String hello;
        //需要使用@Bean标签
        @Bean
        Student stu;
        //AfterViews注释定义的方法会在OnCreate方法的setContentView后执行
        @AfterViews
        void init()
        {
            tv.setText("asfsdf");
        }
        //在EditText内容改变时,更新TextView内容
        @AfterTextChange(R.id.edit)
        void afterEditChange(Editable text, TextView hello)
        {
            tv.setText(hello.getText());
        }
        //点击TextView时调用
        @Click(R.id.tv)
        void tvClicked()
        {
            stu.Toast();
            stu.backThread();
        }
        //在stu中也可以回调这个方法来更新UI
        @UiThread
        public void updateTv(int i)
        {
            tv.setText(String.valueOf(i));
        }
     
        
    }
    

    Enhancing custom classes 优化自定义类

    你可以在一个不是标准Android组件(比如Activity,Service)的类中使用注解。
    你只需要使用 @EBean进行注解:

    @EBean
    public class MyClass {
    
    }
    

    一个用 @EBean 注解的类必须只有一个构造函数。这个构造函数必须是无参的,或者,在AndroidAnnotations 2.7以后,可以带一个类型为Context的参数。

    Injecting implementations in assignable fields 注入实现到指定的字段

    假如你想在代码中通过API使用一个依赖关系(不论是父类还是接口),你可以指定实现类作为 @Bean 注入的参数值。

    @EActivity
    public class MyActivity extends Activity {
    
        /* 
         * A MyImplementation instance will be injected.      
         * MyImplementation must be annotated with @EBean and implement MyInterface.     
         */
        @Bean(MyImplementation.class)
        MyInterface myInterface;
    
    }
    

    那样是不是提供了松耦合的优势呢?其实,这个类还是知道它自己的依赖实现,但是至少代码使用这些依赖必须依靠API,这其实是一个很有意思的目的。

    Supported annotations 所支持的注解

    你可以在 @EBean 类中使用大部分的AA注解:

    @EBean
    public class MyClass {
    
      @SystemService
      NotificationManager notificationManager;
    
      @UiThread
      void updateUI() {
    
      }
    
    }
    

    View related annotations 和视图相关的注解

    你可以在 @EBean 类中使用和视图相关 (@View, @Click...) 的注解:

    @EBean
    public class MyClass {
    
      @ViewById
      TextView myTextView;
    
      @Click(R.id.myButton)
      void handleButtonClick() {
    
      }
    }
    

    请注意,只有当依赖于 MyClass 的Android根组件是一个activity,并且它的布局文件包含了所需的视图,这些注解才会生效。否则, myTextView 会为null,handleButtonClick() 也永远不会被调用。

    Injecting the root context 注入root context

    你可以使用@RootContext 注解注入依赖你 @EBean 类的Android根组件。请注意,只有当context的类型正确时,注入才会成功。

    @EBean
    public class MyClass {
    
      @RootContext
      Context context;
    
      // Only injected if the root context is an activity
      @RootContext
      Activity activity;
    
      // Only injected if the root context is a service
      @RootContext
      Service service;
    
      // Only injected if the root context is an instance of MyActivity
      @RootContext
      MyActivity myActivity;
    
    }
    

    在下面这个activity中有一个上述的 MyClass 实例,它的字段 service 将为空。

    @EActivity
    public class MyActivity extends Activity {
    
      @Bean
      MyClass myClass;
    
    }
    

    Executing code after dependency injection 在依赖注入后执行代码

    当你的 @EBean 注解类的构造器被调用后,它的字段还没有注入进来。假如你需要在构建项目的时候执行代码,那么在依赖注入后,你需要添加使用@AfterInject 注解的方法。

    @EBean
    public class MyClass {
    
      @SystemService
      NotificationManager notificationManager;
    
      @Bean
      MyOtherClass dependency;
    
      public MyClass() {
        // notificationManager and dependency are null
      }
    
      @AfterInject
      public void doSomethingAfterInjection() {
        // notificationManager and dependency are set
      }
    
    }
    

    Scopes 作用域

    Since AndroidAnnotations 2.5

    AndroidAnnotations现在支持两个作用域:

    • 默认作用域:每次当新的bean实例创建时都需要注入一个bean

    • 单例作用域:只有第一次才创建bean实例。然后之后一直使用同一个实例注入。

        @EBean(scope = Scope.Singleton)
        public class MySingleton {
      
        }
      

    Caution警告

    • 假如你的bean有了 Singleton 作用域,它将保持application context的引用(使用context.getApplicationContext()。那是因为它是生命周期比任何activity或者service都长,所以它应该在任何Android组件中保留引用,避免引起内存泄漏。

    • 同样,我们也在使用Singleton作用域的 @EBean 组件中禁用了视图注入和视图事件绑定(视图拥有activity的引用,因此有可能产生内存泄漏)。

    相关文章

      网友评论

          本文标题:AndroidStudio中使用AndroidAnnotatio

          本文链接:https://www.haomeiwen.com/subject/loqebxtx.html