注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理.
归纳而言,Android中的注解大概有以下好处
- 提高我们的开发效率
- 更早的发现程序的问题或者错误
- 更好的增加代码的描述能力
- 更加利于我们的一些规范约束
- 提供解决问题的更优解
替代枚举
Android中新引入的替代枚举的注解有IntDef
和StringDef
,这里以IntDef
做例子说明一下.
public class Colors {
@IntDef({RED, GREEN, YELLOW})
@Retention(RetentionPolicy.SOURCE)
public @interface LightColors{}
public static final int RED = 0;
public static final int GREEN = 1;
public static final int YELLOW = 2;
}
- 声明必要的int常量
- 声明一个注解为LightColors
- 使用@IntDef修饰LightColors,参数设置为待枚举的集合
- 使用@Retention(RetentionPolicy.SOURCE)指定注解仅存在与源码中,不加入到class文件中
Null相关的注解
@Nullable 注解的元素可以是Null
@NonNull 注解的元素不能是Null
NonNull检测生效的条件
- 显式传入null
- 在调用方法之前已经判断了参数为null时
setReferrer(null);//提示警告
区间范围注解
Android中的IntRange和FloatRange是两个用来限定区间范围的注解,
float currentProgress; public void setCurrentProgress(@FloatRange(from=0.0f, to=1.0f) float progress)
{
currentProgress = progress;
}
长度以及数组大小限制
@Size(6) String key
权限相关
在Android中,有很多场景都需要使用权限,无论是Marshmallow之前还是之后的动态权限管理.都需要在manifest中进行声明,如果忘记了,则会导致程序崩溃. 好在有一个注解能辅助我们避免这个问题.使用RequiresPermission注解即可.
@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public void changeWallpaper(Bitmap bitmap) throws IOException { }
资源注解
我们使用资源相关的注解修饰了参数,就能很大程度上避免错误的情况.
public String getStringById(@StringRes int stringResId)
{ return getResources().getString(stringResId); }
Color值限定
上面部分提到了ColorRes
,用来限定颜色资源id,这里我们将使用ColorInt
,一个用来限定Color值的注解.
public void setTextColor(@ColorInt int color)
{ mTextColor = ColorStateList.valueOf(color); updateTextColors(); }
CheckResult
这是一个关于返回结果的注解,用来注解方法,如果一个方法得到了结果,却没有使用这个结果,就会有错误出现,一旦出现这种错误,就说明你没有正确使用该方法。
1 2 3 4 | |
线程相关
Android中提供了四个与线程相关的注解
- @UiThread,通常可以等同于主线程,标注方法需要在UIThread执行,比如View类就使用这个注解
- @MainThread 主线程,经常启动后创建的第一个线程
- @WorkerThread 工作者线程,一般为一些后台的线程,比如AsyncTask里面的doInBackground就是这样的.
- @BinderThread 注解方法必须要在BinderThread线程中执行,一般使用较少.
CallSuper
重写的方法必须要调用super方法
使用这个注解,我们可以强制方法在重写时必须调用父类的方法 比如Application的onCreate
,onConfigurationChanged
等.
Keep
在Android编译生成APK的环节,我们通常需要设置minifyEnabled为true实现下面的两个效果
- 混淆代码
- 删除没有用的代码
但是出于某一些目的,我们需要不混淆某部分代码或者不删除某处代码,除了配置复杂的Proguard文件之外,我们还可以使用@Keep注解 .