คำอธิบายประกอบ Android NeedApi กับ TargetApi


98

อะไรคือความแตกต่างระหว่างRequiresApiและTargetApi?

ตัวอย่างใน Kotlin:

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

หมายเหตุ: FingerprintManager.AuthenticationCallbackต้องใช้ apiM

หมายเหตุ 2: หากฉันไม่ใช้ผ้าสำลี TargetApi ล้มเหลวโดยมีข้อผิดพลาด class requires api level 23...

คำตอบ:


90

@RequiresApi - หมายถึงองค์ประกอบที่มีคำอธิบายประกอบควรถูกเรียกใช้ในระดับ API ที่กำหนดขึ้นไปเท่านั้น

@TargetApi - ระบุว่า Lint ควรถือว่าประเภทนี้เป็นการกำหนดเป้าหมายระดับ API ที่กำหนดไม่ว่าเป้าหมายโครงการจะเป็นอย่างไร


51

ก่อนอื่นฉันจะถือว่าเวอร์ชัน min api ของคุณต่ำกว่า api ที่คุณจะเรียกเพราะนั่นคือสิ่งที่คำอธิบายประกอบประเภทนี้มีความหมาย

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

เมื่อมีการใส่คำอธิบายประกอบด้วยวิธีนี้ทุกครั้งที่คุณเรียกใช้วิธีนั้นคุณจะได้รับคำเตือนสีแดงที่ดีว่าการโทรนี้ต้องการเวอร์ชัน api ที่สูงกว่าเวอร์ชัน min api ของคุณ แต่จะไม่หยุดคุณจากการรวบรวมและสร้าง apk ของคุณ จะขัดข้องกับ Android เวอร์ชันต่ำกว่าเมื่อฉันทดสอบ

@TargetApi

สิ่งนี้ไม่ได้ช่วยเลย แต่จะระงับคำเตือนของการเรียก apis ใหม่ในวิธีการของคุณ แต่เมื่อคุณเรียกวิธีนี้จากที่อื่นจะไม่มีคำเตือนที่เป็นขุยเลยและคุณยังสามารถสร้างและติดตั้ง apk ของคุณได้เท่านั้นเพื่อให้เป็นไปตาม หยุดทำงานเมื่อมีการเรียกใช้เมธอดนั้น


3
ฉันพบว่ามันครอบคลุมและเข้าใจง่ายมากกว่าคำตอบอื่น ๆ ในหน้านี้ ดังนั้น +1
Anand Kumar Jha

2
นี่เป็นคำตอบเดียวที่อธิบายทฤษฎี + การปฏิบัติซึ่งควรได้รับการยอมรับจริงๆ
Dmitriy Pavlukhin

37

คล้ายกับสิ่งที่ไมค์พูดดังที่คุณเห็นในเอกสารประกอบ:

บ่งชี้ว่าองค์ประกอบคำอธิบายประกอบควรถูกเรียกใช้ในระดับ API ที่กำหนดหรือสูงกว่าเท่านั้น

สิ่งนี้มีจุดประสงค์คล้ายกับคำอธิบายประกอบ @TargetApi รุ่นเก่า แต่เป็นการแสดงออกอย่างชัดเจนว่านี่เป็นข้อกำหนดของผู้โทรแทนที่จะใช้เพื่อ "ระงับ" คำเตือนภายในวิธีที่เกิน minSdkVersion

ดังที่คุณเห็นที่นี่นี่เป็นการบังคับให้ผู้โทรตรวจสอบ API ที่ใช้เมื่อเรียกใช้วิธีนี้แทนที่จะลบคำเตือนออกจาก IDE / LINT ของคุณ

คุณสามารถเปรียบเทียบสิ่งนี้กับคำอธิบายประกอบ @NonNull หรือ @Null ซึ่งบังคับว่าผู้โทรสามารถ / ไม่สามารถส่งค่า null เข้าไปในฟังก์ชันได้


21

จาก JavaDocs ในhttps://developer.android.com/reference/android/support/annotation/RequiresApi.html :

[@RequiresApi] สิ่งนี้มีจุดประสงค์คล้ายกับคำอธิบายประกอบ @TargetApi รุ่นเก่า แต่เป็นการแสดงออกอย่างชัดเจนว่านี่เป็นข้อกำหนดของผู้โทรแทนที่จะใช้เพื่อ "ระงับ" คำเตือนภายในเมธอดที่เกิน minSdkVersion

ฉันคิดว่ามันเทียบเท่ากับฟังก์ชันการทำงาน แต่@RequiresApiดูเหมือนจะใหม่กว่าและมีโอกาสสูงที่จะได้รับการขยายเพื่อรวมฟังก์ชันการทำงานที่มากขึ้น


@ Penn Care จะอธิบายว่าทำไมถึงเป็นเท็จ?
hamena314

5

ทั้งสองอย่างนี้มีไว้สำหรับคุณสมบัติการจัดการที่เพิ่มในระดับ API ของ Android ใหม่โดยไม่ส่งผลกระทบต่อระดับ API อื่น ๆ

ต้อง

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

ในที่นี้กล่าวว่าองค์ประกอบที่มีคำอธิบายประกอบควรถูกเรียกใช้ในระดับ API ที่กำหนดขึ้นไปเท่านั้น องค์ประกอบคำอธิบายประกอบด้านล่างระดับ API ที่กำหนดจะไม่เรียก

TargetApi

@TargetApi(Build.VERSION_CODES.*api_code*)

บ่งชี้ว่า Lint ควรถือว่าประเภทนี้เป็นการกำหนดเป้าหมายระดับ API ที่กำหนดไม่ว่าเป้าหมายโครงการจะเป็นอย่างไร มีไว้สำหรับระดับ API ที่ระบุเท่านั้น จะไม่เรียกระดับ API อื่น ๆ


เมื่อฉันใช้@RequiresApiAS ขีดเส้นใต้การเรียกเมธอดด้วยสีแดงและทั้งคลาสมีข้อผิดพลาด
CoolMind

@CoolMind คุณใช้ "@RequiresApi" ในวิธีการใด
jeevan venugopal

@TargetApiไม่ฉันเพิ่มก่อนที่จะใช้วิธีการเช่น
CoolMind

@CoolMind พยายามใช้ "@RequiresApi" กับวิธีการที่คุณโทรมา หรือล้อมวงเรียกแบบนี้. if (Build.VERSION.SDK_INT> = Build.VERSION_CODES. * api_code *) {// your method name}
jeevan venugopal

ใช่ใช้if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {งานได้ แต่ฉันมีอยู่แล้วในวิธีการ ขอบคุณ!
CoolMind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.