Chú thích android RequestApi so với TargetApi


98

Sự khác biệt giữa RequiresApiTargetApi?

Mẫu trong kotlin:

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

LƯU Ý: FingerprintManager.AuthenticationCallbackyêu cầu apiM

LƯU Ý 2: nếu tôi không sử dụng TargetApi lint thất bại với lỗi class requires api level 23...

Câu trả lời:


87

@RequiresApi - Biểu thị rằng phần tử được chú thích chỉ nên được gọi ở cấp API đã cho hoặc cao hơn.

@TargetApi - Chỉ ra rằng Lint nên coi loại này là nhắm mục tiêu đến một cấp API nhất định, bất kể mục tiêu của dự án là gì.


42

Trước tiên, tôi sẽ cho rằng phiên bản api tối thiểu của bạn thấp hơn api mà bạn định gọi, bởi vì đó là nơi mà những loại chú thích này có ý nghĩa

@RequiresApi(Build.VERSION_CODES.N_MR1)
public void hello() { // codes that call system apis introduced in android N_MR1}

Khi một phương thức được chú thích bằng điều này, bất cứ lúc nào bạn gọi phương thức đó, bạn sẽ nhận được một cảnh báo màu đỏ đẹp mắt rằng lệnh gọi này yêu cầu phiên bản api cao hơn phiên bản api tối thiểu của bạn, nhưng nó không ngăn bạn biên dịch và xây dựng apk của mình, nó sẽ chỉ gặp sự cố trên các phiên bản Android thấp hơn khi tôi thử nghiệm nó.

@TargetApi

Điều này không giúp ích gì cả, nó ngăn chặn các cảnh báo gọi apis mới trong phương thức của bạn, nhưng khi bạn gọi phương thức này từ một nơi khác, không có cảnh báo xơ vải nào cả và bạn vẫn có thể xây dựng và cài đặt apk của mình chỉ để đáp ứng sụp đổ khi phương thức đó được gọi.


2
Tôi thực sự thấy nó toàn diện và dễ hiểu hơn là các câu trả lời khác có sẵn trên trang này. Do đó +1.
Anand Kumar Jha

1
Đây là câu trả lời duy nhất giải thích lý thuyết + thực hành, thực sự nên chấp nhận.
Dmitriy Pavlukhin

37

Tương tự như những gì Mike đã nói, như bạn có thể thấy trong tài liệu:

Biểu thị rằng phần tử được chú thích chỉ nên được gọi ở cấp API đã cho hoặc cao hơn.

Mục đích này tương tự với chú thích @TargetApi cũ hơn, nhưng thể hiện rõ ràng hơn rằng đây là một yêu cầu đối với người gọi, chứ không phải được sử dụng để "ngăn chặn" các cảnh báo trong phương thức vượt quá minSdkVersion.

Như bạn có thể thấy ở đây, điều này thực sự đang buộc người gọi xác minh API được sử dụng khi gọi vào phương thức này, thay vì chỉ xóa cảnh báo khỏi IDE / LINT của bạn.

Bạn có thể so sánh điều này với các chú thích @NonNull hoặc @Null, chúng thực thi rằng người gọi có thể / không thể gửi giá trị null vào hàm.


21

Từ JavaDocs trong https://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] Mục đích này tương tự như chú thích @TargetApi cũ hơn, nhưng thể hiện rõ ràng hơn rằng đây là một yêu cầu đối với người gọi, thay vì được sử dụng để "ngăn chặn" các cảnh báo trong phương thức vượt quá minSdkVersion.

Tôi cho rằng chúng tương đương về mặt chức năng nhưng @RequiresApicó vẻ mới hơn và có cơ hội được mở rộng để bao gồm nhiều chức năng hơn.


@Penn Care giải thích tại sao điều này là sai?
hamena314

6

Cả hai đều để xử lý tính năng được thêm vào các cấp API android mới mà không ảnh hưởng đến các cấp API khác.

RequestApi

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

Ở đây nó nói rằng phần tử được chú thích chỉ nên được gọi ở cấp API đã cho hoặc cao hơn. Phần tử được chú thích bên dưới cấp API nhất định sẽ không gọi.

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

Chỉ ra rằng Lint nên coi loại này là nhắm mục tiêu đến một cấp API nhất định, bất kể mục tiêu của dự án là gì. Chỉ dành cho cấp API được chỉ định. Sẽ không được gọi ở cấp API khác.


Khi tôi sử dụng @RequiresApi, AS đã gạch chân một lệnh gọi phương thức có màu đỏ và cả một lớp có chứa lỗi.
CoolMind

@CoolMind Bạn đã sử dụng "@RequiresApi" bên trong phương thức nào chưa?
jeevan venugopal

Không, tôi đã thêm nó vào trước một phương thức, giống như @TargetApi.
CoolMind

@CoolMind cố gắng sử dụng "@RequiresApi" cho phương thức bạn đang gọi. Hoặc bao quanh cuộc gọi như thế này. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// tên phương thức của bạn}
jeevan venugopal

Có, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {hoạt động, nhưng tôi đã có nó trong phương thức. Cảm ơn!
CoolMind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.