Support Annotation Library使用详解

概述

Support Annotation Library是在Android Support Library19.1版本开始引入的一个全新的函数包,它包含了诸多有用的元注解。用来帮助开发者在编译期间发现可能存在的bug。Support Library自己也使用Annotations Library提供的注解来完善Library的代码质量。
Android的每个版本都在不断的完善Annotation Library,在Android Support Library22.2版本中,又新增了13种新的Annotation Library注解。Android Support Library发展到25,已经有多个独立的jar,如咱们常见的Support-v4,Support-v7…java

Annotation Library的使用

若是咱们的sdk安装了Android Support Respository,那么咱们能够打开工程的Srrucure,选中Module,选中Dependencies选项卡,点击添加按钮,选中Android Library。而后经过gradle能够很容易的把这些注解添加到咱们的工程中。android

compile 'com.android.support:support-annotations:23.1.1'

经常使用注解

Nullness注解

使用@NonNull注解修饰的参数不能为null。在下面的代码例子中,咱们有一个取值为null的name变量,它被做为参数传递给sayHello函数,而该函数要求这个参数是非null的String类型:web

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String name = null;
        sayHello(name);
    }

    void sayHello(@NonNull String s) {
        Toast.makeText(this, "Hello " + s, Toast.LENGTH_LONG).show();
    }
}

因为代码中参数String s使用@NonNull注解修饰,所以IDE将会以警告的形式提醒咱们这个地方有问题。
这里写图片描述api

资源类型注解

咱们知道在Android中,资源一般以整型表示,并保存在R.java中,这意味着若是资源传的是String类型,则编译就会报错,为了给开发者以提示,Android有了资源类型注解,在最新的版本中,每种资源都对应一种注解。
这里写图片描述
常见的资源型注解以下:
AnimRes
AnimatorRes
AnyRes
ArrayRes
AttrRes
BoolRes
ColorRes
DimenRes
DrawableRes
FractionRes
IdRes
IntegerRes
InterpolatorRes
LayoutRes
MenuRes
PluralsRes
RawRes
StringRes
StyleRes
StyleableRes
TransitionRes
XmlRes多线程

类型定义注解

在Android开发中,整型不只用来表明资源引用值,还能够用来表明枚举,IntDef注解就是用来定义整型的新注解,咱们能够用来标记咱们本身编写的api,例如:ide

public class IceCreamFlavourManager {
    private int flavour;
    public static final int VANILLA = 0;
    public static final int CHOCOLATE = 1;
    public static final int STRAWBERRY = 2;
    @IntDef({VANILLA, CHOCOLATE, STRAWBERRY})
    public @interface Flavour {
    }
    @Flavour
    public int getFlavour() {
        return flavour;
    }
    public void setFlavour(@Flavour int flavour) {
        this.flavour = flavour;
    }
}

这时若是咱们使用错误的整型值调用IceCreamFlavourManager.setFlavour时,IDE将报错。
这里写图片描述
固然咱们也能够指定整型值做为标志位,也就是说这些整型值可使用’|’或者’&’进行与或等操做。若是咱们把@Flavour定义为以下标志位。svg

@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY})

    public @interface Flavour {

}

那么咱们能够这么调用。函数

iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager
                .CHOCOLATE);

@StringDef用法和@IntDef基本差很少。gradle

权限注解

在Android中,有不少场景都须要使用权限,不管是Marshmallow以前仍是以后的动态权限管理.都须要在manifest中进行声明,若是忘记了,则会致使程序崩溃. 好在有一个注解能辅助咱们避免这个问题.使用RequiresPermission注解便可。ui

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
  public void changeWallpaper(Bitmap bitmap) throws IOException {
}

Color值限定注解

上面部分提到了ColorRes,用来限定颜色资源id,这里咱们将使用ColorInt,一个用来限定Color值的注解. 在较早的TextView的setTextColor是这样实现的。

public void setTextColor(int color) {
  mTextColor = ColorStateList.valueOf(color);
  updateTextColors();
}

线程注解

Android开发中常常会涉及到不少线程,如主线程,子线程等操做。我相信你们在使用什么EventBus,消息总线…看的比较多,Android中提供了四个与线程相关的注解。

  • @UiThread,一般能够等同于主线程,标注方法须要在UIThread执行,好比View类就使用这个注解
  • @MainThread 主线程,常常启动后建立的第一个线程
  • @WorkerThread 工做者线程,通常为一些后台的线程,好比AsyncTask里面的doInBackground就是这样的.
  • @BinderThread 注解方法必需要在BinderThread线程中执行,通常使用较少.
    例如大名鼎鼎的AsyncTask。
new AsyncTask<Void, Void, Void>() {
    //doInBackground is already annotated with @WorkerThread
    @Override
    protected Void doInBackground(Void... params) {
      return null;
      updateViews();//error
    }
  };
 
@UiThread
public void updateViews() {
  Log.i(LOGTAG, "updateViews ThreadInfo=" + Thread.currentThread());
}

注意,这种状况下不会出现错误提示。

new Thread(){
  @Override
  public void run() {
    super.run();
    updateViews();
  }
}.start();

虽然updateViews会在一个新的工做者线程中执行,可是在compile时没有错误提示。由于它的判断依据是,若是updateView的线程注解(这里为@UiThread)和run(没有线程注解)不一致才会错误提示.若是run方法没有线程注解,则不提示。

CallSuper重写函数注解

重写的方法必需要调用super方法。使用这个注解,咱们能够强制方法在重写时必须调用父类的方法 好比ApplicationonCreate,onConfigurationChanged等。

@Keep注解

在Android编译生成APK的环节,咱们一般须要设置minifyEnabled为true实现下面的两个效果
混淆代码
删除没有用的代码
可是出于某一些目的,咱们须要不混淆某部分代码或者不删除某处代码,除了配置复杂的Proguard文件以外,咱们还可使用@Keep注解 。

@Keep
public static int getBitmapWidth(Bitmap bitmap) {
  return bitmap.getWidth();
}

返回值注解

咱们开发的时候,有时候须要对返回的值作一些出来,那么久用到了@CheckResult注解,若是一个方法获得告终果,却没有使用这个结果,就会有错误出现,一旦出现这种错误,就说明你没有正确使用该方法。

@CheckResult
public String trim(String s) {
  return s.trim();
}

注解在Android开发中随处能够看到,如ButterKnife,afinal,eventbus等,这些都大大提升了咱们的开发效率。

本文同步分享在 博客“xiangzhihong8”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索