Android使用注解進(jìn)行代碼檢查的實(shí)現(xiàn)方法
Android Studio 內(nèi)置了代碼檢查工具 Lint,可在菜單欄選擇 Analyze > Inspect Code 執(zhí)行相應(yīng)的代碼檢查,代碼檢查能夠根據(jù)推斷一些不合法的潛在問(wèn)題,有助于在開(kāi)發(fā)階段發(fā)現(xiàn)開(kāi)發(fā)者因?yàn)橹鞴茉驅(qū)е碌囊幌麓a問(wèn)題,Android 官方提供了注解庫(kù) support-annotations 來(lái)幫助開(kāi)發(fā)者及早發(fā)現(xiàn)問(wèn)題,下面是常用的一些注解,主要內(nèi)容如下:
- Nullness注解
- 資源注解
- 線(xiàn)程注解
- 值約束注解
- 權(quán)限注解
- 返回值注解
- CallSuper注解
- Typedef注解
- 可訪(fǎng)問(wèn)性注解
Nullness注解
使用 Nullness 注解可以檢查給定變量、參數(shù)和返回值是否允許 null 值,具體如下:
- @Nullable :表示可以為 null 的變量、參數(shù)或返回值,
- @NonNull :表示不可為 null 的變量、參數(shù)或返回值。
@NonNull
@Override
public View onCreateView(String name, @NonNull Context context,@NonNull AttributeSet attrs) {
//...
}
資源注解
資源注解的使用可使得在源碼階段讓編輯器檢查書(shū)寫(xiě)的不規(guī)范,也可在一定程度上優(yōu)化代碼結(jié)構(gòu),下面是常見(jiàn)的資源注解如下:
- @StringRes: 表示檢查是否包含R.string引用
- @ColorRes: 表示檢查是否包含R.color引用
- @ColorInt: 表示檢查是否包含表示顏色的整型
- @DrawableRes: 表示檢查是否包含R.drawable引用
- @DimenRes: 表示檢查是否包含R.dimen引用
- @InterpolatorRes:表示檢查是否包含插值器引用
線(xiàn)程注解
線(xiàn)程注解可以檢查某個(gè)方法是否從某個(gè)特定類(lèi)型的線(xiàn)程中調(diào)用,支持一下線(xiàn)程注解,具體如下:
- @MainThread:表示主線(xiàn)程
- @UiThread:表示 UI 線(xiàn)程
- @WorkerThread:表示工作線(xiàn)程
- @BinderThread:表示Binder線(xiàn)程
- @AnyThread:表示任何一個(gè)線(xiàn)程
上述注解中 @MainThread 和 @UiThread 在大多時(shí)候表示的都是同一線(xiàn)程,如果應(yīng)用中帶有多個(gè)試圖,UI 線(xiàn)程可與主線(xiàn)程不同,故可使用 @UIThread 標(biāo)注與應(yīng)用的視圖層次相關(guān)聯(lián)的方法,使用 @MainThread 僅標(biāo)注與應(yīng)用生命周期相關(guān)聯(lián)的方法。線(xiàn)程注解最常用的一個(gè)用途是 AsyncTask 使用中的方法替換,因?yàn)?AsyncTask 會(huì)執(zhí)行后臺(tái)操作并將結(jié)果發(fā)布到 UI 線(xiàn)程。
值約束注解
使用值約束注解可驗(yàn)證傳遞的參數(shù)的值的合法性,可以借此指定參數(shù)的設(shè)置范圍,可在一定程度上減少代碼在主觀(guān)程度上出現(xiàn)的錯(cuò)誤,常見(jiàn)的值約束注解如下:
- @IntRange:表示可以驗(yàn)證整型參數(shù)是否在指定范圍內(nèi)
- @FloatRange:表示可以驗(yàn)證浮點(diǎn)型參數(shù)是否在指定范圍內(nèi)
- @Size:表示可以驗(yàn)證集合、數(shù)組、字符串參數(shù)是否在指定范圍內(nèi),可指定最大值、最小值以及確切值
上面的注解有一些可使用的參數(shù),如 from、to、min 等,使用時(shí)具體在某個(gè)注解體重查看定義即可。
權(quán)限注解
權(quán)限注解 @RequiresPermission 可以驗(yàn)證方法調(diào)用方的權(quán)限,即當(dāng)使用了權(quán)限注解的方法時(shí)會(huì)檢查有沒(méi)有指定的權(quán)限,如果沒(méi)有則會(huì)提示要在 AndroidManifest.xml 文件中申明權(quán)限,如果是危險(xiǎn)權(quán)限還有進(jìn)行權(quán)限動(dòng)態(tài)申請(qǐng),使用方式參考如下:
/**
* 單個(gè)權(quán)限檢查
* @param message
*/
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public void setMessage(String message) {
}
/**
* 全部權(quán)限檢查
* @param message
*/
@RequiresPermission(allOf = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}
/**
* 某個(gè)權(quán)限檢查
* @param message
*/
@RequiresPermission(anyOf = {
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE})
public void setMesage(String message) {
}
返回值注解
返回值注解 @CheckResult 會(huì)檢查某個(gè)方法的返回值是否被使用,如果沒(méi)有被使用,則會(huì)根據(jù) suggest 配置建議使用相同公民沒(méi)有返回值的另一個(gè)方法,如果返回值使用了,則和未加該注解的方法一樣,使用方式參考如下:
@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public int checkPermission(@NonNull String permission, int pid, int uid){
return 0;
}
如果沒(méi)有使用返回值提示如下:

當(dāng)返回值沒(méi)有被使用,則會(huì)建議使用相同功能沒(méi)有返回值的另一個(gè)方法,簡(jiǎn)而言之,返回值注解 @CheckResult 能夠表示某個(gè)方法實(shí)際使用的時(shí)方法本身的處理還是方法最終的處理結(jié)果。
CallSuper注解
使用 @CallSuper 注解會(huì)驗(yàn)證子類(lèi)的重寫(xiě)方法是否調(diào)用父類(lèi)的實(shí)現(xiàn),這樣約束的好處是可保證父類(lèi)的實(shí)現(xiàn)不會(huì)修改,當(dāng)然,如果不使用該注解,子類(lèi)重寫(xiě)父類(lèi)的方法可以不調(diào)用弗父類(lèi)的默認(rèn)實(shí)現(xiàn),具體參考如下:
/**
* 父類(lèi)
* @CallSuper注解的使用
*/
public class Test {
//使用@CallSuper注解,子類(lèi)重寫(xiě)該方法時(shí)必須調(diào)用該方法
@CallSuper
protected void onCreate(){
}
}
下面是 Test 類(lèi)的實(shí)現(xiàn)類(lèi):
/**
* 子類(lèi)
* @CallSuper注解的使用
*/
public class TestImpl extends Test{
@Override
protected void onCreate() {
super.onCreate();
/**
* 如果不調(diào)用父類(lèi)的方法,則會(huì)提示
* Some methods, such as View#onDetachedFromWindow, require that you also call the super implementation as part of your method.
*/
}
}
Typedef注解
使用 @IntDef 和 @StringDef 注解 可以創(chuàng)建整型和字符串的枚舉注解來(lái)驗(yàn)證其他代碼中使用的某些整型和字符串,可以保證代碼中的某些常量整型或常量字符串是某些具體定義的常量集,這兩個(gè)注解的位置只能是注解。
開(kāi)發(fā)中總會(huì)使用到枚舉,枚舉在一定程度上可使得代碼結(jié)構(gòu)更清晰,但枚舉的使用會(huì)增加內(nèi)存的開(kāi)銷(xiāo),這里可以用 Typedef 注解的方式來(lái)代替枚舉,下面是 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;
}
}
可見(jiàn) Typedef 注解約束了使用到的某些整型,當(dāng)然還可以是字符串,這樣也能達(dá)到枚舉的作用。
可訪(fǎng)問(wèn)性注解
可訪(fǎng)問(wèn)性注解是 @VisibleForTesting 和 @Keep 可以表示方法、字段、類(lèi)的可訪(fǎng)問(wèn)性。具體如下:
- @VisibleForTesting:表示注解的某個(gè)代碼塊的可見(jiàn)性高于能夠測(cè)試時(shí)需要的水平
- @Keep:表示被注解的代碼塊將不會(huì)被混淆。
最常用的可能就是資源注解,如 @StringRes、@ColorRes、@ColorInt等,還有Typeof 注解,該注解可以在替換枚舉在 Android 開(kāi)發(fā)中帶來(lái)的性能影響,如果平時(shí)留意這些注解在 Android 源碼中也經(jīng)常使用,所以可在開(kāi)發(fā)過(guò)程中嘗試去使用這些注解以進(jìn)行必要的代碼檢查。
總結(jié)
到此這篇關(guān)于A(yíng)ndroid使用注解進(jìn)行代碼檢查的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Android 注解代碼檢查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android清空編輯框內(nèi)容功能的實(shí)現(xiàn)實(shí)例代碼
本篇文章主要介紹了Android清空編輯框數(shù)據(jù)功能的實(shí)現(xiàn)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03
Android AsyncTask的優(yōu)缺點(diǎn)詳解
本文主要介紹了Android AsyncTask的優(yōu)缺點(diǎn),具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
Android 實(shí)現(xiàn)電話(huà)攔截及攔截提示音功能的開(kāi)發(fā)
本文主要介紹Android 實(shí)現(xiàn)電話(huà)攔截和攔截提示音功能的開(kāi)發(fā),這里提供實(shí)現(xiàn)代碼和詳細(xì)講解,有需要的小伙伴可以參考下2016-08-08
Android動(dòng)畫(huà)實(shí)現(xiàn)原理和代碼
這篇文章主要介紹了Android動(dòng)畫(huà)實(shí)現(xiàn)原理和代碼分析,如果你對(duì)此感興趣,跟著小編學(xué)習(xí)下吧。2017-12-12
Handler制作簡(jiǎn)單相冊(cè)查看器的實(shí)例代碼
下面小編就為大家分享一篇Handler制作簡(jiǎn)單相冊(cè)查看器的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
android利用websocket協(xié)議與服務(wù)器通信
這篇文章主要為大家詳細(xì)介紹了android利用websocket協(xié)議與服務(wù)器通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Android 6.0以上權(quán)限拒絕打開(kāi)權(quán)限設(shè)置界面的解決方法
今天小編就為大家分享一篇Android 6.0以上權(quán)限拒絕打開(kāi)權(quán)限設(shè)置界面的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

