阅读更多

概述

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…

Annotation Library的使用

如果我们的sdk安装了Android Support Respository,那么我们可以打开工程的Srrucure,选中Module,选中Dependencies选项卡,点击添加按钮,选中Android Library。然后通过gradle可以很容易的把这些注解添加到我们的工程中。

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

常用注解

Nullness注解

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

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将会以警告的形式提醒我们这个地方有问题。 

资源类型注解

我们知道在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,例如:

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定义为如下标志位。

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

那么我们可以这么调用。

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

@StringDef用法和@IntDef基本差不多。

权限注解

在Android中,有很多场景都需要使用权限,无论是Marshmallow之前还是之后的动态权限管理.都需要在manifest中进行声明,如果忘记了,则会导致程序崩溃. 好在有一个注解能辅助我们避免这个问题.使用RequiresPermission注解即可。

@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    }  };@UiThreadpublic 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注解 。

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

返回值注解

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

@CheckResultpublic String trim(String s) {  return s.trim();}

注解在Android开发中随处可以看到,如ButterKnife,afinal,eventbus等,这些都大大提高了我们的开发效率。

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android——ContentProvider总结
  3. Android中使用定时器的三种方法
  4. Android(安卓)从原型模式看java实例化对象clone和new的区别
  5. Android高仿IOS和QQ的弹出对话框
  6. Android仿考拉全局滑动返回及联动效果的实现方法
  7. 关于android双卡手机sim卡信息采集适配的心得
  8. android中常见的内存溢出和解决办法
  9. Windows下Rk3288替换内核以及Launcher方法记录

随机推荐

  1. Android上使用jspf插件框架的方法
  2. Android快速批量打渠道包(AndroidManifest
  3. android maven eclipse里面新建maven工程
  4. Android键盘相应的PC键各是哪些
  5. Android编译系统三
  6. android 仿人人网滑动侧边栏
  7. 什么是OPhone SDK?
  8. 如何设置圆角的EditText——Android移动
  9. android 管理应用的内存
  10. Android 2.3 发短信详细流程