Support Annotation Library 包
- Support Annotation Library它包含一系列有用的元注解,用来帮助开发者在编译期间发现可能存在的bug。
- 在Android Studio中,提供可视化的交互以便开发者发现问题。
一一对注解记录。
1.Nullness
- @Nullable 作用于函数参数或返回值,标记参数或返回值为可以空。
@NonNull 作用于函数参数或返回值,标记参数或返回值为不能为空。
示例代码
public class MainActivity extends AppCompatActivity { private final static String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test1(null);//在 Android studio 上会提示。不能为null test2(null); } public void test1(@NonNull String str) { Log.v(MainActivity.TAG, str); } public void test2(@Nullable String str) { Log.v(MainActivity.TAG, str); } }
2.资源类型注解
资源类型的注解作用于函数参数、返回值及类的变量,每种资源类型对应一种注解。
AnimatorRes:标记整型值是android.R.animation类型。
AnimRes:标记整型是android.R.anim类型。
AnyRes:标记整型是任何一种资源类型,如果确切知道表示的是哪一个具体资源的话,建议显式指定。
ArrayRes:标记整型是android.R.array类型。
AttrRes:标记整型是android.R.attr类型。
BoolRes:标记整型是布尔类型。
ColorRes:标记整型是android.R.color类型。
DrawableRes:标记整型是android.R.drawable类型。
FranctionRes:标记整型值是fraction类型,这个比较少见,这种类型资源常见于AnimationXml中,比如50%,表示占parent的50%
IdRes:标记整型是android.R.id类型。
IntegerRes:标记整型是android.R.integer类型。
InterpolatorRes:标记整型是android.R.interpolator类型,插值器,在AnimationXml中使用较多。
LayoutRes:标记整型是android.R.layout类型。
MenuRes:标记整型是android.R.menu类型。
RawRes:标记整型是android.R.raw类型。
StringRes:标记整型是android.R.string类型。
StyleableRes:标记整型是android.R.styleable类型。
StyleRes:标记整型是android.R.style类型。
XmlRes:标记整型是android.R.xml类型。
示例代码
test1(R.string.app_name);//这里传入R.string类型,传入其他会报错 public void test1(@StringRes int strRes) { }
3.类型定义注解
@IntDef
示例代码
public class AnnotationTest { //这里给TestIntDef注解加上了@IntDef,这样在使用TestIntDef的时候必须传入指定参数,若是非法在编译时就会报异常。 //使用就非常简单了,找个类继承抽象类,实现方法。在调用的时候,只能传入指定的TEST_1,TEST_2,TEST_3。 //这样就可以自定义资源类型注解,非常方便。 public static final int TEST_1 = 0; public static final int TEST_2 = 1; public static final int TEST_3 = 2; @Retention(RetentionPolicy.SOURCE) @IntDef({TEST_1, TEST_2, TEST_3}) public @interface TestIntDef { } @TestIntDef public int getTest() { //只能返回TEST_1,TEST_2,TEST_3。返回其他报错 return TEST_1; } /** * @param test 只能传入指定的 TEST_1,TEST_2,TEST_3。其他报错 */ public void setTest(@TestIntDef int test) { } }
4.线程注解
Android应用开发过程中,经常会涉及到多种线程的使用,界面相关操作必须在主线程,而耗时操作如文件下载等必须在后台线程中,
线程注解相关有四种。
1.@UiThread:标记运行在UI线程,一个应用只有一个UI线程,多数是用于View的标注。
2.@MainThread:标记运行在主线程,一个应用只有一个主线程,主线程也是@UiThread线程。
3.@WorkerThread:标记运行在后台运行线程。
4.@BinderThread:标记运行在Binder线程。
没什么鸟用,只能标记一下,又不能切换线程。
5.RGB颜色值注解
@ColorRes
示例代码
/** * @param color 整你是 RGB颜色值对应的int值,否则报错 */ public void setTestColor(@ColorInt int color) { }
6.值范围注解
当函数参数的取值在一定范围时,可以使用注解来防止调用者传入错误的参数。
主要注解有三种。1.@Size:对于类似数组、集合和字符串之类的参数,我们可以使用@Size注解来表示这些参数的大小。用法:
@Size(min=1)//可以表示集合不可以为空 @Size(max=23)//可以表示字符串最大字符个数为23 @Size(2)//表示数组元素个数为2个 @Size(multiple=2)//可以表示数组大小是2的倍数
2.@IntRange:参数类型是int或者long,用法如下
public void setInt(@intRange(from=0,to=255)){...}
3.@FloatRange:参数类型是float或者double,用法如下
public void setFloat(@FloatRange(from=0.0,to=1.0)){...}
7.权限注解
Android应用在使用某些系统功能时,需要在AndroidManifest.xml中声明权限,否则在运行时就会提示缺失对应的权限,
为了在编译时及时发现权限的缺失,我们可以使用@RequiresPermission注解。
1.如果需要一个权限则加注解。
- @RequiresPermission(Manifest.permission.SET_WALLPAPER)
2.如果需要一个集合至少一个权限,那么就加注解。
- @RequiresPermission(anyOf= {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
3.如果同时需要多个权限,那么就加注解。
- @RequiresPermission(allOf = {Manifest.permission.SET_WALLPAPER,Manifest.permission.CAMERA})
4.对于Intent调用所需权限的ACTION字符串定义处添加注解。
- @RequiresPermission(android.Manifest.permission.BLUETOOTH)
StringACTION_REQUEST_DISCOVERRAVLE = “android.bluetooth.adapter.REQUEST_DISCOVERRAVLE”;
- @RequiresPermission(android.Manifest.permission.BLUETOOTH)
5.对于ContentProvider所需权限,可能有读和写两个操作。对应不同的权限。
- @RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
@RequiresPermission.Write(@RequestPermission(WRITE_HISTORY_BOOLMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse(“content://browser/bookmarks);
- @RequiresPermission.Read(@RequestPermission(READ_HISTORY_BOOLMARKS))
8.重写函数注解
如果API允许重写某个函数,但是要求在重写该函数时需要调用super父类的函数。
@CallSuper , 可以加注解@CallSuper来提示开发者。
代码示例
public abstract class AnnotationTest { /** * 要求在重写该函数时需要调用super父类的函数。 */ @CallSuper public void testCallSuper() { //子类必须调用父类的super } } public class AnnotationTestSub extends AnnotationTest { /** * 重写testCallSuper方法时,必须调用super.testCallSuper(); */ @Override public void testCallSuper() { super.testCallSuper();//若是重写不调用super就会报错。 } }
9.@Keep注解
- @keep是用来标记在Proguard混淆过程中不需要混淆的类或者方法。
10.@SuppressWarnings注解
这个注解在源码里是随处可见,其实它的用法很简单,就是对一些警告信息的过滤。
示例:@SuppressWarnings(“unchecked”) 告诉编译器忽略 unchecked警告信息,如使用List,ArrayList等未进行参数化产生的警告信息。
@SuppressWarnings(“serial”)
如果编译器出现这样的警告信息:The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long使用这个注释将警告信息去掉。@SuppressWarnings(“deprecation”) 如果使用了使用@Deprecated注释的方法,编译器将出现警告信息。使用这个注释将警告信息去掉。
@SuppressWarnings(“unchecked”, “deprecation”) 告诉编译器同时忽略unchecked和deprecation的警告信息。
@SuppressWarnings(value={“unchecked”, “deprecation”}) 等同于 @SuppressWarnings(“unchecked”, “deprecation”)
小结
- 多利用注解到项目中提高自己编码的质量