AndroidStudio中使用AndroidAnnotation的简单介绍
2016-09-22 21:29
344 查看
AndroidStudio中使用AndroidAnnotation的简单介绍
简介
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的引用,因此有可能产生内存泄漏)。
相关文章推荐
- Android中使用Universal-Image-Loader图片缓存
- android looper的理解
- Android学习笔记之RecyclerView详解
- Android Studio 自动生成 Gson bean(json解析快捷方法)
- Android 6.0 Reboot 流程源代码分析
- Android的性能优化
- WebSocket实现Android客户端之间的简单通讯
- Android adb 模拟滑动 按键 点击事件
- Android-播放音频文件
- AndroidStudio项目提交(更新)到github最详细步骤
- android 导入第三方包出错
- [Android | 小代码] 天气预报 简易Demo json解析数组+对象 Gson+Volley简单使用
- 15 个 Android 通用流行框架大全
- Android studio 修改工程名、包名
- 如何使用Material Design中的BottomSheetBehavior、BottomSheetDialog和BottomSheetDialogFragment
- Android 自定义View
- 从源码出发深入理解 Android Service
- Android 常用抓包工具介绍之Charles
- Android本地存储
- Android 读取SD卡中文件以及内存使用情况