Najpierw założę, że Twoja minimalna wersja api jest niższa niż api, które zamierzasz wywołać, ponieważ to właśnie tam tego rodzaju adnotacje mają sens
@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() {
Gdy metoda jest oznaczona tą adnotacją, za każdym razem, gdy wywołujesz tę metodę, otrzymasz ładne czerwone ostrzeżenie, że to wywołanie wymaga wersji API wyższej niż twoja minimalna wersja api, ale nie powstrzymuje cię to przed kompilacją i budowaniem apk, to po prostu ulegnie awarii na niższych wersjach Androida, gdy go testowałem.
@TargetApi
To wcale nie pomaga, pomija ostrzeżenia o wywołaniu nowego interfejsu API w twojej metodzie, ale kiedy wywołujesz tę metodę z innego miejsca, nie ma żadnego ostrzeżenia o kłaczkach i nadal możesz zbudować i zainstalować swój apk tylko po to, aby spotkać się z awaria, gdy ta metoda jest wywoływana.
Podobnie jak powiedział Mike, jak widać w dokumentacji:
Jak widać tutaj, w rzeczywistości wymusza to na wywołującym sprawdzenie API, które zostało użyte podczas wywoływania tej metody, zamiast po prostu usuwać ostrzeżenie z IDE / LINT.
Możesz to porównać z adnotacjami @NonNull lub @Null, które wymuszają, że wywołujący może / nie może wysyłać wartości null do funkcji.
źródło
Z JavaDocs w https://developer.android.com/reference/android/support/annotation/RequiresApi.html :
Przypuszczam, że są funkcjonalnie równoważne, ale
@RequiresApi
wydają się być nowsze i mają większą szansę na rozszerzenie w celu uwzględnienia większej funkcjonalności.źródło
Oba służą do obsługi funkcji dodanej do nowych poziomów interfejsu API systemu Android bez wpływu na inne poziomy interfejsu API.
Wymaga api
@RequiresApi(api = Build.VERSION_CODES.*api_code*)
Tutaj jest napisane, że element z adnotacjami powinien być wywoływany tylko na danym poziomie API lub wyższym. Element z adnotacjami poniżej podanego poziomu interfejsu API nie zostanie wywołany.
TargetApi
@TargetApi(Build.VERSION_CODES.*api_code*)
Wskazuje, że Lint powinien traktować ten typ jako przeznaczony dla danego poziomu interfejsu API, bez względu na cel projektu. Przeznaczone tylko dla określonego poziomu API. Nie będzie wywoływany na innym poziomie interfejsu API.
źródło
@RequiresApi
, AS podkreślił wywołanie metody kolorem czerwonym, a także całą klasę jako zawierającą błąd.@TargetApi
.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
działa, ale mam to już w metodzie. Dzięki!