Android使用注解进行代码检查的实现方法

Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执行相应的代码检查,代码检查能够根据推断一些不合法的潜在问题,有助于在开发阶段发现开发者因为主管原因导致的一下代码问题,Android 官方提供了注解库 support-annotations 来帮助开发者及早发现问题,下面是常用的一些注解,主要内容如下:

  • Nullness注解
  • 资源注解
  • 线程注解
  • 值约束注解
  • 权限注解
  • 返回值注解
  • CallSuper注解
  • Typedef注解
  • 可访问性注解

Nullness注解

使用 Nullness 注解可以检查给定变量、参数和返回值是否允许 null 值,具体如下:

  • @Nullable :表示可以为 null 的变量、参数或返回值,
  • @NonNull :表示不可为 null 的变量、参数或返回值。
@NonNull
@Override
public View onCreateView(String name, @NonNull Context context,@NonNull AttributeSet attrs) {
  //...
}

资源注解

资源注解的使用可使得在源码阶段让编辑器检查书写的不规范,也可在一定程度上优化代码结构,下面是常见的资源注解如下:

  • @StringRes: 表示检查是否包含R.string引用
  • @ColorRes: 表示检查是否包含R.color引用
  • @ColorInt: 表示检查是否包含表示颜色的整型
  • @DrawableRes: 表示检查是否包含R.drawable引用
  • @DimenRes: 表示检查是否包含R.dimen引用
  • @InterpolatorRes:表示检查是否包含插值器引用

线程注解

线程注解可以检查某个方法是否从某个特定类型的线程中调用,支持一下线程注解,具体如下:

  • @MainThread:表示主线程
  • @UiThread:表示 UI 线程
  • @WorkerThread:表示工作线程
  • @BinderThread:表示Binder线程
  • @AnyThread:表示任何一个线程

上述注解中 @MainThread 和 @UiThread 在大多时候表示的都是同一线程,如果应用中带有多个试图,UI 线程可与主线程不同,故可使用 @UIThread 标注与应用的视图层次相关联的方法,使用 @MainThread 仅标注与应用生命周期相关联的方法。线程注解最常用的一个用途是 AsyncTask 使用中的方法替换,因为 AsyncTask 会执行后台操作并将结果发布到 UI 线程。

值约束注解

使用值约束注解可验证传递的参数的值的合法性,可以借此指定参数的设置范围,可在一定程度上减少代码在主观程度上出现的错误,常见的值约束注解如下:

  • @IntRange:表示可以验证整型参数是否在指定范围内
  • @FloatRange:表示可以验证浮点型参数是否在指定范围内
  • @Size:表示可以验证集合、数组、字符串参数是否在指定范围内,可指定最大值、最小值以及确切值

上面的注解有一些可使用的参数,如 from、to、min 等,使用时具体在某个注解体重查看定义即可。

权限注解

权限注解 @RequiresPermission 可以验证方法调用方的权限,即当使用了权限注解的方法时会检查有没有指定的权限,如果没有则会提示要在 AndroidManifest.xml 文件中申明权限,如果是危险权限还有进行权限动态申请,使用方式参考如下:

/**
 * 单个权限检查
 * @param message
 */
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void setMessage(String message) {
}

/**
 * 全部权限检查
 * @param message
 */
@RequiresPermission(allOf = {
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}

/**
 * 某个权限检查
 * @param message
 */
@RequiresPermission(anyOf = {
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}

返回值注解

返回值注解 @CheckResult 会检查某个方法的返回值是否被使用,如果没有被使用,则会根据 suggest 配置建议使用相同公民没有返回值的另一个方法,如果返回值使用了,则和未加该注解的方法一样,使用方式参考如下:

@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public int checkPermission(@NonNull String permission, int pid, int uid){
  return 0;
}

如果没有使用返回值提示如下:

当返回值没有被使用,则会建议使用相同功能没有返回值的另一个方法,简而言之,返回值注解 @CheckResult 能够表示某个方法实际使用的时方法本身的处理还是方法最终的处理结果。

CallSuper注解

使用 @CallSuper 注解会验证子类的重写方法是否调用父类的实现,这样约束的好处是可保证父类的实现不会修改,当然,如果不使用该注解,子类重写父类的方法可以不调用弗父类的默认实现,具体参考如下:

/**
 * 父类
 * @CallSuper注解的使用
 */
public class Test {
  //使用@CallSuper注解,子类重写该方法时必须调用该方法
  @CallSuper
  protected void onCreate(){

  }
}

下面是 Test 类的实现类:

/**
 * 子类
 * @CallSuper注解的使用
 */
public class TestImpl extends Test{
  @Override
  protected void onCreate() {
    super.onCreate();
    /**
     * 如果不调用父类的方法,则会提示
     * Some methods, such as View#onDetachedFromWindow, require that you also call the super implementation as part of your method.
     */
  }
}

Typedef注解

使用 @IntDef 和 @StringDef 注解 可以创建整型和字符串的枚举注解来验证其他代码中使用的某些整型和字符串,可以保证代码中的某些常量整型或常量字符串是某些具体定义的常量集,这两个注解的位置只能是注解。

开发中总会使用到枚举,枚举在一定程度上可使得代码结构更清晰,但枚举的使用会增加内存的开销,这里可以用 Typedef 注解的方式来代替枚举,下面是 Tyoedef 注解的使用,参考如下:

/**
 * Typedef 注解的定义
 */
public class ActionType {

  public static final int ACTION_TYPE_0 = 0;
  public static final int ACTION_TYPE_1 = 1;
  public static final int ACTION_TYPE_2 = 2;

  @Retention(RetentionPolicy.SOURCE)
  @IntDef({ACTION_TYPE_0,ACTION_TYPE_1,ACTION_TYPE_2})
  public @interface ActionTypeDef{

  }
}

下面是上述 Typedef 注解的使用方式,参考如下:

/**
 * Typedef注解的使用
 * @param value
 */
private void setValue(@ActionType.ActionTypeDef int value) {
  switch (value) {
    case ActionType.ACTION_TYPE_0:
      break;
    case ActionType.ACTION_TYPE_1:
      break;
    case ActionType.ACTION_TYPE_2:
      break;

//    case 100://不能使用未定义的整型
//      break;
  }
}

可见 Typedef 注解约束了使用到的某些整型,当然还可以是字符串,这样也能达到枚举的作用。

可访问性注解

可访问性注解是 @VisibleForTesting 和 @Keep 可以表示方法、字段、类的可访问性。具体如下:

  • @VisibleForTesting:表示注解的某个代码块的可见性高于能够测试时需要的水平
  • @Keep:表示被注解的代码块将不会被混淆。

最常用的可能就是资源注解,如 @StringRes、@ColorRes、@ColorInt等,还有Typeof 注解,该注解可以在替换枚举在 Android 开发中带来的性能影响,如果平时留意这些注解在 Android 源码中也经常使用,所以可在开发过程中尝试去使用这些注解以进行必要的代码检查。

总结

到此这篇关于Android使用注解进行代码检查的实现方法的文章就介绍到这了,更多相关Android 注解代码检查内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android基于注解的6.0权限动态请求框架详解

    前言 安卓6.0之后,一些敏感权限需要进行动态请求,虽说编写请求授权代码并不难,但是每次一需要权限就需要在视图中添加一段代码,严重影响代码美观,同时也增加了一点点工作量. 于是,小盆友闲暇之余基于AOP封装了一个基于注解的权限请求框架.如果有幸加入您的项目,使用过程中有问题或是有哪些不便,请留言区或github上与我交流,共同进步.如果喜欢这个框架请给个star和❤️. github地址:https://github.com/zincPower/JPermission 先上图,看看效果...第一

  • android 检查网络连接状态实现步骤

    获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 1)判断是否有网络连接 复制代码 代码如下: public boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConn

  • Android 中的注解详细介绍

    注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一些工作原理. 归纳而言,Android中的注解大概有以下好处 提高我们的开发效率 更早的发现程序的问题或者错误 更好的增加代码的描述能力 更加利于我们的一些规范约束 提供解决问题的更优解 准备工作 默认情况下,Android中的注解包并没有包括在framework中,它独立成一个单独的包,通常我们需要引入这个包. dependencies

  • Android中检查、监听电量和充电状态的方法

    当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始. 电池寿命通过剩余电量和充电状态来影响应用更新的执行.当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快.如果设备不在充电,降低更新频率可以帮助延长电池寿命. 类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新. 注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容.并非仅仅指更新应用版本.如果是用户动作,比如翻页刷新,

  • Android中检查、设置默认程序详解

    Android作为一个伟大的系统,自然提供了设置默认打开程序的实现.在这篇文章中,我会介绍如何在Android系统中设置默认的程序. 在设置默认程序之前,无非有两种情况,一种是已经有默认的程序,另一种则是没有任何默认程序. 检测是否有默认的程序 检查是必须的,因为结果关乎着我们下一步该怎么做. 复制代码 代码如下: public void testGetDefaultActivity() {     PackageManager pm = mContext.getPackageManager()

  • Android中检查网络连接状态的变化无网络时跳转到设置界面

    在AndroidManifest.xml中加一个权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> 主代码中实现: @Over

  • Android使用注解进行代码检查的实现方法

    Android Studio 内置了代码检查工具 Lint,可在菜单栏选择 Analyze > Inspect Code 执行相应的代码检查,代码检查能够根据推断一些不合法的潜在问题,有助于在开发阶段发现开发者因为主管原因导致的一下代码问题,Android 官方提供了注解库 support-annotations 来帮助开发者及早发现问题,下面是常用的一些注解,主要内容如下: Nullness注解 资源注解 线程注解 值约束注解 权限注解 返回值注解 CallSuper注解 Typedef注解

  • Android代码检查规则Lint的自定义与应用详解

    目录 前言: 什么是Lint 自定义Lint流程: 1. 新创建module,Module类型选择Java or Kotlin Library, 暂时命名lint_tools 2. 在build.gradle中引入lint的依赖 3. 本地创建个资源id命名检查规则,用来规范项目中的id统一命名 4. 实现IssueRegistry并添加对应的自定义Issue: 5. 在module(lint_tools)中对应的build.gradle中配置如下信息: 6. 在需要进行lint检查的modul

  • Android用注解与反射实现Butterknife功能

    目录 自定义注解 使用自定义注解 通过反射机制获取注解参数 1. 布局文件获取 2. 控件获取实现 3. 控件点击响应 自定义注解 1) 先定义布局文件注入 //注解的作用域在类上 @Target(ElementType.TYPE) //让保持性策略为运行时态,将注解编码到class文件中,让虚拟机读取 @Retention(RetentionPolicy.RUNTIME) public @interface ContentView { int value();//使用时直接@ContentVi

  • Android AOP注解Annotation详解(一)

    Android 注解Annotation 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) Android AOP 等在Android上应用越来越广泛,例如框架ButterKnife,Dagger2,EventBus3等等,这里我自己总结了一个学习路程. - Java的注解Annotation - 注解处理解析器APT(Annotation Processing Tool)

  • Android AOP 注解详解及简单使用实例(三)

    Android  注解 相关文章: Android AOP注解Annotation详解(一) Android AOP之注解处理解释器详解(二) Android AOP 注解详解及简单使用实例(三) 一.简介 在Android 里面 注解主要用来干这么几件事: 和编译器一起给你一些提示警告信息. 配合一些ide 可以更加方便快捷 安全有效的编写Java代码.谷歌出的support-annotations这个库 就是主要干这个的. 和反射一起 提供一些类似于spring 可配置的功能,方便简洁. 二

  • Android视频点播的实现代码(边播边缓存)

    简述 一些知名的视频app客户端(优酷,爱奇艺)播放视频的时候都有一些缓存进度(二级进度缓存),还有一些短视频app,都有边播边缓的处理.还有就是当文件缓存完毕了再次播放的话就不再请求网络了直接播放本地文件了.既节省了流程又提高了加载速度. 今天我们就是来研究讨论实现这个边播边缓存的框架,因为它不和任何的业务逻辑耦合. 开源的项目 目前比较好的开源项目是:https://github.com/danikula/AndroidVideoCache 代码的架构写的也很不错,网络用的httpurlco

  • Android开发常用经典代码段集锦

    本文实例总结了Android开发常用经典代码段.分享给大家供大家参考,具体如下: 1.图片旋转 Bitmap bitmapOrg = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable.moon); Matrix matrix = new Matrix(); matrix.postRotate(-90);//旋转的角度 Bitmap resizedBitmap = Bitmap.createBitma

  • Android 反射注解与动态代理综合使用详解

    前言 本章内容主要研究一下java高级特性-反射.android注解.和动态代理的使用,通过了解这些技术,可以为了以后实现组件化或者Api hook相关的做一些技术储备. 反射 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高 比较常用的方法 getDeclare

  • Android打赏功能实现代码(支付宝转账)

    适用于个人开发者开发的APP中,让用户打赏给作者,实质上进行支付宝转账到指定账号的功能. 一.打开'支付宝'APP ,点击'收款'功能 ,将收款码(二维码)图片保存到手机上(进一步移到电脑上). 二.找一个在线二维码解析网页工具,解析一下收款码图片.将最后一个/后面的字符串复制出来,这是需要使用的部分 三.添加如下的一个工具类 public class AlipayUtil { // 支付宝包名 private static final String ALIPAY_PACKAGE_NAME =

  • 详解使用Spring AOP和自定义注解进行参数检查

    引言 使用SpringMVC作为Controller层进行Web开发时,经常会需要对Controller中的方法进行参数检查.本来SpringMVC自带@Valid和@Validated两个注解可用来检查参数,但只能检查参数是bean的情况,对于参数是String或者Long类型的就不适用了,而且有时候这两个注解又突然失效了(没有仔细去调查过原因),对此,可以利用Spring的AOP和自定义注解,自己写一个参数校验的功能. 代码示例 注意:本节代码只是一个演示,给出一个可行的思路,并非完整的解决

随机推荐