Câu hỏi rất thú vị. Tôi nghĩ rằng nó chủ yếu là một ý nghĩa ngữ nghĩa, và cũng có thể là do lý do lịch sử.
Mặc dù trong các triển khai Hoạt động và Dịch vụ Android hiện tại getApplication()
và getApplicationContext()
trả về cùng một đối tượng, không có gì đảm bảo rằng điều này sẽ luôn luôn như vậy (ví dụ: trong một triển khai nhà cung cấp cụ thể).
Vì vậy, nếu bạn muốn lớp Ứng dụng mà bạn đã đăng ký trong Bản kê khai, bạn không bao giờ nên gọi getApplicationContext()
và chuyển nó sang ứng dụng của mình, vì đó có thể không phải là phiên bản ứng dụng (mà bạn rõ ràng đã trải nghiệm với khung kiểm tra).
Tại sao getApplicationContext()
tồn tại ở nơi đầu tiên?
getApplication()
chỉ khả dụng trong lớp Activity và lớp Service, trong khi getApplicationContext()
được khai báo trong lớp Context.
Điều đó thực sự có nghĩa là một điều: khi viết mã trong một máy thu quảng bá, không phải là một bối cảnh nhưng được cung cấp một bối cảnh trong phương thức onReceive của nó, bạn chỉ có thể gọi getApplicationContext()
. Điều đó cũng có nghĩa là bạn không được đảm bảo có quyền truy cập vào ứng dụng của mình trong BroadcastReceiver.
Khi nhìn vào mã Android, bạn sẽ thấy rằng khi được đính kèm, một hoạt động sẽ nhận được một bối cảnh cơ bản và một ứng dụng và đó là những tham số khác nhau. getApplicationContext()
đại biểu nó gọi tới baseContext.getApplicationContext()
.
Một điều nữa: tài liệu nói rằng hầu hết các trường hợp, bạn không cần phải phân lớp Ứng dụng:
Thông thường không cần phải phân lớp Application
. Trong hầu hết các tình huống, singletons tĩnh có thể cung cấp chức năng tương tự theo cách mô đun hơn. Nếu singleton của bạn cần một bối cảnh toàn cầu (ví dụ để đăng ký máy thu quảng bá), chức năng truy xuất nó có thể được cung cấp
Context
trong đó sử dụng nội bộ Context.getApplicationContext()
khi lần đầu tiên xây dựng singleton.
Tôi biết đây không phải là một câu trả lời chính xác và chính xác, nhưng vẫn trả lời câu hỏi của bạn?
Application
đối tượng trong ứng dụng của mình.