网站首页 > 技术教程 正文
概述
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'
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();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
由于代码中参数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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
这时如果我们使用错误的整型值调用IceCreamFlavourManager.setFlavour时,IDE将报错。
当然我们也可以指定整型值作为标志位,也就是说这些整型值可以使用’|’或者’&’进行与或等操作。如果我们把@Flavour定义为如下标志位。
@IntDef(flag = true, value = {VANILLA, CHOCOLATE, STRAWBERRY}) public @interface Flavour {
}
1
2
3
4
5
1
2
3
4
5
那么我们可以这么调用。
iceCreamFlavourManager.setFlavour(IceCreamFlavourManager.VANILLA & IceCreamFlavourManager .CHOCOLATE);
1
2
1
2
@StringDef用法和@IntDef基本差不多。
权限注解
在Android中,有很多场景都需要使用权限,无论是Marshmallow之前还是之后的动态权限管理.都需要在manifest中进行声明,如果忘记了,则会导致程序崩溃. 好在有一个注解能辅助我们避免这个问题.使用RequiresPermission注解即可。
@RequiresPermission(Manifest.permission.SET_WALLPAPER) public void changeWallpaper(Bitmap bitmap) throws IOException {
}
1
2
3
1
2
3
Color值限定注解
上面部分提到了ColorRes,用来限定颜色资源id,这里我们将使用ColorInt,一个用来限定Color值的注解. 在较早的TextView的setTextColor是这样实现的。
public void setTextColor(int color) {
mTextColor = ColorStateList.valueOf(color);
updateTextColors();
}
1
2
3
4
1
2
3
4
线程注解
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());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
注意,这种情况下不会出现错误提示。
new Thread(){ @Override
public void run() { super.run();
updateViews();
}
}.start();
1
2
3
4
5
6
7
1
2
3
4
5
6
7
虽然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();
}
1
2
3
4
1
2
3
4
返回值注解
我们开发的时候,有时候需要对返回的值做一些出来,那么久用到了@CheckResult注解,如果一个方法得到了结果,却没有使用这个结果,就会有错误出现,一旦出现这种错误,就说明你没有正确使用该方法。
@CheckResultpublic String trim(String s) { return s.trim();
}
1
2
3
4
1
2
3
4
注解在Android开发中随处可以看到,如ButterKnife,afinal,eventbus等,这些都大大提高了我们的开发效率。
猜你喜欢
- 2024-10-19 Java 项目编译提示 javax.xml.bind.annotation does not exist 错误
- 2024-10-19 Android annotation包下常用的注解
- 2024-10-19 SpringMVC疑难一:mvc:annotation-dr
- 2024-10-19 Spring 中 AnnotationConfigUtils
- 2024-10-19 spring mvc 配置失效了?(springmvc的配置)
- 2024-10-19 为什么都爱着江南?黛瓦白墙,烟雨朦胧,是文人魂牵梦绕的故乡
- 2024-10-19 Spring框架系列之构造方法底层剖析01
- 2024-10-19 基于.NET6包含DDD,ES,CQRS等概念的开源
- 2024-10-19 spring 中 AnnotationUtils 的常用方法
- 2024-10-19 SpringBoot实战4-Spring基础-IoC容器
你 发表评论:
欢迎- 最近发表
-
- Win11学院:如何在Windows 11上使用WSL安装Ubuntu
- linux移植(Linux移植freemodbus)
- 独家解读:Win10预览版9879为何无法识别硬盘
- 基于Linux系统的本地Yum源搭建与配置(ISO方式、RPM方式)
- Docker镜像瘦身(docker 减小镜像大小)
- 在linux上安装ollama(linux安装locale)
- 渗透测试系统Kali推出Docker镜像(kali linux渗透测试技术详解pdf)
- Linux环境中部署Harbor私有镜像仓库
- linux之间传文件命令之Rsync傻瓜式教程
- 解决ollama在linux中安装或升级时,通过国内镜像缩短安装时长
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)