`
xiangzhihong
  • 浏览: 9301 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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…

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
    }
  };

@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等,这些都大大提高了我们的开发效率。

分享到:
评论

相关推荐

    深入浅出Android Support Annotation

    ### 深入浅出Android Support Annotation #### 引言 在Android开发过程中,为了提高代码的可读性和维护性,开发者们会采用各种各样的技术手段,其中使用注解是一种非常有效的方法之一。Android Support Library ...

    v7包解决importandroid.support.annotation.RequiresApi

    在Android开发中,`import android.support.annotation.RequiresApi`是一个经常使用的注解,它用于标记一个方法或类,表明这个元素只能在特定版本的Android API级别及以上才能被使用。`v7包`是Android Support ...

    完整的android.support.annotation

    完整的android.support.annotation.jar包含Nullable、Keep、XmlRes、TransitionRes、WorkerThread等共49个类

    annotation详解

    【标题】:注解(Annotation)详解 注解(Annotation)是Java编程语言中的一个重要特性,自Java 5版本引入,它提供了一种安全的方法来将元数据与代码关联。元数据是关于数据的数据,可以用来提供程序的额外信息,如...

    annotation 详解

    ### Annotation详解 #### 一、概述 在Java编程语言中,`Annotation`(注解)是一种元数据形式,用于向编译器或分析工具提供有关程序的信息,而不会影响程序的实际执行逻辑。开发者可以通过注解来标记代码的不同...

    ssh for annotation完整实现加详解

    ssh for annotation完整实现加详解 可以直接copy代码 有详细解释

    Java-Annotation使用大全

    Java-Annotation使用大全 Java-Annotation使用大全 Java-Annotation使用大全

    MpApt,Kotlin Native/JS/JVM Annotation Processor library.zip

    MpApt - Kotlin (Native/JS/JVM) Annotation Processor library I wrote an annotation processing libary that can detect annotations in Kotlin Native/JS and Jvm projects, because Kapt is only ...

    Java_Annotation详解

    ### Java_Annotation详解 #### 元数据的作用与分类 元数据在编程中扮演着至关重要的角色,尤其是在Java中,通过注解(Annotation)这一特性,元数据被广泛应用于多个方面,包括但不限于文档生成、代码分析以及编译...

    Java自定义注解Annotation的使用

    ### Java自定义注解Annotation的使用 #### 1. 前言 自从JDK 1.5引入了注解这一特性以来,它已经成为Java开发中的一个重要组成部分。注解最初是为了推动EJB 3.0的普及和发展而设计的,其目的是减少配置文件的使用,...

    jakarta.annotation-api-1.3.5-API文档-中英对照版.zip

    赠送jar包:jakarta.annotation-api-1.3.5.jar; 赠送原API文档:jakarta.annotation-api-1.3.5-javadoc.jar; 赠送源代码:jakarta.annotation-api-1.3.5-sources.jar; 赠送Maven依赖信息文件:jakarta.annotation...

    spring的annotation-driven配置事务管理器详解 (多数据源配置

    Spring 的 Annotation-Driven 配置事务管理器详解(多数据源配置) Spring 框架提供了强大的事务管理机制,通过使用 Annotation-Driven 配置,可以方便地管理事务。在多数据源配置中,spring 的 Annotation-Driven...

    Annotation使用手册

    ### Annotation使用手册详解 #### 一、Annotation的基本概念 **Annotation** 在 Java 1.5+ 版本中被引入,作为一种与程序元素关联任何信息或元数据(metadata)的途径。从某种程度上看,Annotation 类似于修饰符,...

    详解Android注解 Annotation

    3. `Room Persistence Library`: 数据库框架,使用注解简化数据库操作。 五、运行时注解与编译时注解 根据注解的保留策略,注解分为运行时注解和编译时注解: - 运行时注解:可以在运行时通过反射获取,如`@...

Global site tag (gtag.js) - Google Analytics