28

RequiresApiTargetApi有什麼區別?RequiresApi vs TargetApi android註釋

樣品在科特林:

@RequiresApi(api = Build.VERSION_CODES.M) 
@TargetApi(Build.VERSION_CODES.M) 
class FingerprintHandlerM() : FingerprintManager.AuthenticationCallback() 

注:FingerprintManager.AuthenticationCallback需要API M

注2:如果我不使用TargetApi皮棉失敗,錯誤class requires api level 23...

回答

15

@RequiresApi - 表示註釋元素只應在給定的API級別或更高級別上調用。

@TargetApi - 表示Lint應該將此類型視爲針對給定的API級別,而不管項目目標是什麼。

13

從JavaDoc中https://developer.android.com/reference/android/support/annotation/RequiresApi.html

[@RequiresApi]這與舊版@TargetApi註釋類似,但更清楚地表示這是對調用者的要求,而不是用於「壓制」超出minSdkVersion的方法中的警告。

我想他們在功能上是等價的,但@RequiresApi似乎更新,並有更大的機會被擴展到包括更多的功能。

+0

@彭關心解釋爲什麼這是錯誤的? – hamena314

20

什麼邁克說,因爲你可以在文檔中看到類似:

表示該註解的元素只能在給定的API級別或更高級別被調用。

這與舊版@TargetApi註釋類似,但更清楚地表示這是對調用者的要求,而不是用於「壓制」超出minSdkVersion的方法中的警告。

正如您在這裏看到的,這實際上是強制調用者驗證調用此方法時使用的API,而不是從IDE/LINT中刪除警告。

您可以將其與@NonNull或@Null註釋進行比較,它們強制調用者可以/不能將空值發送到函數中。

1

它們都是用於處理添加到新的android API級別的功能而不影響其他API級別。

RequiresApi

@RequiresApi(api = Build.VERSION_CODES.*api_code*) 

這表示,該註釋元素只能在給定的API級別或更高級別被調用。給定API級別下的註釋元素不會調用。

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*) 

表示林特應該把這種類型的靶向給定的API級別,無論該項目的目標是什麼。僅適用於指定的API級別。 不會在其他API級別上調用。