คำถามที่น่าสนใจมาก ฉันคิดว่ามันเป็นความหมายเชิงความหมายส่วนใหญ่และอาจเป็นเพราะเหตุผลทางประวัติศาสตร์
แม้ว่าในกิจกรรม Android และการใช้งานบริการปัจจุบันgetApplication()
และgetApplicationContext()
ส่งคืนวัตถุเดียวกันไม่มีการรับประกันว่านี่จะเป็นกรณี (เช่นในการใช้งานของผู้ขายที่เฉพาะเจาะจง)
ดังนั้นหากคุณต้องการคลาสแอปพลิเคชันที่คุณลงทะเบียนใน Manifest คุณไม่ควรโทรgetApplicationContext()
และส่งไปยังแอปพลิเคชันของคุณเพราะมันอาจไม่ใช่อินสแตนซ์ของแอปพลิเคชัน
ทำไม getApplicationContext()
มีอยู่ในสถานที่แรก?
getApplication()
มีเฉพาะในคลาสกิจกรรมและคลาสบริการเท่านั้น getApplicationContext()
มีการประกาศในคลาสบริบท
นั่นหมายถึงสิ่งหนึ่ง: เมื่อเขียนโค้ดในเครื่องรับสัญญาณออกอากาศซึ่งไม่ใช่บริบท แต่ได้รับบริบทในวิธีการ onReceive คุณสามารถโทรได้เท่านั้น getApplicationContext()
ของคุณสามารถโทรออกเท่านั้น ซึ่งหมายความว่าคุณไม่รับประกันว่าจะสามารถเข้าถึงแอปพลิเคชันของคุณใน BroadcastReceiver
เมื่อดูรหัส Android คุณจะเห็นว่าเมื่อแนบมาแล้วกิจกรรมจะได้รับบริบทพื้นฐานและแอปพลิเคชันและสิ่งเหล่านั้นเป็นพารามิเตอร์ที่แตกต่างกัน ผู้ได้รับมอบหมายก็เรียกร้องให้getApplicationContext()
baseContext.getApplicationContext()
อีกอย่างหนึ่ง: เอกสารบอกว่าส่วนใหญ่คุณไม่จำเป็นต้องใช้คลาสย่อย:
โดยปกติแล้วไม่มีต้อง Application
subclass ในสถานการณ์ส่วนใหญ่ Singletons แบบคงที่สามารถให้ฟังก์ชั่นเดียวกันในทางโมดูลาร์มากขึ้น หากซิงเกิลของคุณต้องการบริบทส่วนกลาง (ตัวอย่างเช่นในการลงทะเบียนเครื่องรับสัญญาณออกอากาศ) ฟังก์ชั่นเพื่อดึงข้อมูลสามารถกำหนดสิ่ง
Context
ที่ใช้ภายในContext.getApplicationContext()
เมื่อสร้างซิงเกิลครั้งแรก
ฉันรู้ว่านี่ไม่ใช่คำตอบที่แน่นอนและแม่นยำ แต่ถึงกระนั้นนั่นก็ตอบคำถามของคุณได้หรือไม่?
Application
วัตถุในแอปของคุณอย่างชัดเจน