sự khác biệt và khi nào sử dụng getApplication (), getApplicationContext (), getBaseContext () và someClass.this


121

Tôi mới đến Android và tôi đang cố gắng để hiểu sự khác biệt giữa getApplication(), getApplicationContext(), getBaseContext(), getContext()someClass.thisđặc biệt là khi sử dụng các phương pháp này trong các dòng mã sau:

Khi tôi nâng cốc chúc mừng, sự khác biệt giữa những thứ này là gì và tôi sử dụng chúng trong những trường hợp nào?

Toast.makeText(LoginActivity.this, "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplication(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getApplicationContext(), "LogIn successful", Toast.LENGTH_SHORT).show();
Toast.makeText(getBaseContext(), "LogIn successful", Toast.LENGTH_SHORT).show();

tương tự với ý định:

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
Intent intent = new Intent(MenuPagina., LoginActivity.class);
Intent intent = new Intent(getBaseContext(), LoginActivity.class);
Intent intent = new Intent(getApplication(), LoginActivity.class);


chúng chỉ xử lý ngữ cảnh và baseContext. nhưng tôi muốn hiểu tất cả cách sử dụng của họ trong 2 bối cảnh. cảm ơn
Pheonix7

Câu trả lời:


215

Bánh mì nướngÝ định , cả hai đều yêu cầu tham chiếu đến ngữ cảnh . Và getApplication , getApplicationContext , LoginActivity.thisgetBaseContext , tất cả chúng đều cung cấp tham chiếu đến ngữ cảnh.

Bây giờ điều gây nhầm lẫn là việc khai báo các ngữ cảnh khác nhau và cách sử dụng cụ thể của chúng. Để làm cho mọi thứ trở nên đơn giản, bạn nên đếm hai loại ngữ cảnh có sẵn trong Android framework.

  1. Bối cảnh ứng dụng
  2. Bối cảnh hoạt động

Bối cảnh ứng dụng gắn liền với vòng đời của ứng dụng và sẽ luôn giống nhau trong suốt vòng đời của ứng dụng. Vì vậy, nếu bạn đang sử dụng Bánh mì nướng , bạn có thể sử dụng ngữ cảnh ứng dụng hoặc thậm chí ngữ cảnh hoạt động (cả hai) vì bánh mì nướng có thể được nâng lên từ bất kỳ đâu trong ứng dụng của bạn và không được gắn vào cửa sổ.

Bối cảnh hoạt động gắn liền với vòng đời của Hoạt động và có thể bị phá hủy nếu hoạt động đó onDestroy()được nâng lên. Nếu bạn muốn khởi chạy một hoạt động mới, bạn phải sử dụng ngữ cảnh của hoạt động đó trong Mục đích để hoạt động khởi chạy mới được kết nối với hoạt động hiện tại (về mặt ngăn xếp hoạt động). Tuy nhiên, bạn cũng có thể sử dụng ngữ cảnh của ứng dụng để khởi chạy một hoạt động mới nhưng sau đó bạn cần đặt cờ Intent.FLAG_ACTIVITY_NEW_TASKtheo ý định để coi nó như một nhiệm vụ mới.

Bây giờ đề cập đến các trường hợp của bạn:

LoginActivity.this mặc dù nó tham chiếu đến lớp của riêng bạn mở rộng lớp Hoạt động nhưng lớp cơ sở (Hoạt động) cũng mở rộng lớp Ngữ cảnh, vì vậy nó có thể được sử dụng để cung cấp ngữ cảnh hoạt động.

getApplication() mặc dù tham chiếu đến đối tượng Ứng dụng nhưng lớp Ứng dụng mở rộng lớp Ngữ cảnh, vì vậy nó có thể được sử dụng để cung cấp ngữ cảnh ứng dụng.

getApplicationContext() cung cấp ngữ cảnh ứng dụng.

getBaseContext() cung cấp bối cảnh hoạt động.

Lời khuyên: Bất cứ khi nào bạn cần thao tác, Viewshãy chuyển sang Activity-Context , còn lại Application-Context là đủ.


11
vì vậy nếu tôi hiểu đúng, someClass.this, getBaseContext và getContext () là ngữ cảnh hoạt động trong khi getApplicationContext () và getApplication () là ngữ cảnh ứng dụng?
Pheonix7,

bối cảnh chỉ là thông tin về một môi trường phải không?
committedandroider

Vâng, nó giống như sandbox mà host ứng dụng
waqaslam

@comiledandroider vì ngữ cảnh hoạt động chứa thông tin bổ sung cho chủ đề đã chọn, vì vậy khi lượt xem được tạo bằng mã thì chủ đề chính xác sẽ tự động được áp dụng. Mọi chi tiết, bạn có thể đọc này
waqaslam

@waqaslam đề cập đến các Lớp sdk android, Context-> ContextWrapper-> 1. Application& 2. ContextThemeWrapper-> Activity; và getBaseContext()là phương pháp của ContextWrapper, getBaseContext() offers activity context.cũng như Application Contextquá ... phải không?
Bhuro

26

Câu trả lời bởi Waqas là rất rõ ràng và đầy đủ, tuy nhiên tôi muốn làm rõ thêm sự khác biệt giữa việc sử dụng thisvs getBaseContext(), hoặc getApplication()vs getApplicationContext(). Cả hai ActivityApplicationmở rộng không phải Contextchính nó, nhưng ContextWrapper, là một

"Việc Contextủy quyền thực hiện điều đó chỉ đơn giản là ủy quyền tất cả các lệnh gọi của nó cho một lệnh khác Context".

Bối cảnh "thực" đó là những gì bạn nhận được bằng cách sử dụng getBaseContext().

Vì vậy, mặc dù this(cho Activity) và getBaseContext()cả hai đều cung cấp bối cảnh hoạt động, chúng

  • (a) không tham chiếu đến cùng một đối tượng ( this != getBaseContext()) và
  • (b) việc gọi ngữ cảnh thông qua thishơi kém hiệu quả hơn, vì các lệnh gọi trải qua một cấp độ chuyển hướng bổ sung. Tuy nhiên, tôi nghi ngờ nó tạo ra bất kỳ sự khác biệt thực tế nào.

Cùng một logic áp dụng cho getApplication()vs getApplicationContext().


Theo những gì getBaseContext()có liên quan, các Nhà phát triển Android của Google đã đề xuất điều này: "Không sử dụng getBaseContext (), chỉ sử dụng Ngữ cảnh bạn có." Vì vậy, trên thực tế, họ đề xuất bạn sử dụng thischo Hoạt động.
ChuongPham 19/12/12

đây là lời giải thích rõ ràng nhất getBaseContextmà tôi tìm thấy trên Internet. Cảm ơn!!
q126y

6
LoginActivity.this 

dòng trên là một Activity chắc chắn là một Context .. điều này được sử dụng khi bạn tạo một số AlertDialog ... Tại một số nơi, bạn bắt buộc phải sử dụng Activity Context ...

getApplication()

Tương tự ở đây, phương thức tạo văn bản cần có Ngữ cảnh và Ứng dụng tự triển khai Context

getApplicationContext()

đây là cách ưa thích nhất vì cách này Contextvẫn tồn tại cho đến khi Ứng dụng tắt.

getBaseContext()

Ngữ cảnh này có sẵn cho các tiện ích và Chế độ xem ..

Nhưng Tất cả chúng đều cung cấp một đối tượng Context và không có gì khác ..


Vì vậy, trong một thông báo toast hoặc khi tạo một ý định, tất cả chúng đều có cùng tác dụng, mặc dù sử dụng getApplicationContext () là chính xác nhất?
Pheonix7

1
@Hassan Samii: Đối với Bánh mì nướng, bạn có thể sử dụng getApplicationContext()cho mọi tình huống, nhưng tốt hơn là bạn nên sử dụng thiskhi làm Bánh mì nướng trong một Hoạt động.
ChuongPham 19/12/12

0

Class.this được sử dụng nếu lớp của bạn mở rộng Activity getapplication () đã sử dụng ứng dụng tham chiếu và ứng dụng mở rộng ngữ cảnh ứng dụng getbasecontext () tham chiếu ngữ cảnh bối cảnh hoạt động của bạn tham khảo ngữ cảnh vòng đời hoạt động của bạn applicationcontext tham chiếu đến vòng đời ứng dụng của bạn

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.