차이점 및 getApplication (), getApplicationContext (), getBaseContext () 및 someClass.this를 사용하는 경우


121

나는 안드로이드를 처음 접했고 getApplication(), getApplicationContext() 의 차이점을 이해하려고 노력하고 있습니다 .getBaseContext() , getContext()그리고 someClass.this특히 다음 코드 라인에서 이러한 방법을 사용하는 방법과 :

토스트를 시작할 때 이들과 사용하는 경우의 차이점은 무엇입니까?

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();

의도와 동일 :

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);


컨텍스트와 baseContext 만 처리합니다. 그러나 나는 2 개의 contexes에서 모든 사용법을 이해하고 싶습니다. 감사
Pheonix7

답변:


215

ToastIntent , 둘 다 컨텍스트에 대한 참조가 필요합니다 . 그리고 getApplication , getApplicationContext , LoginActivity.thisgetBaseContext 는 모두 컨텍스트에 대한 참조를 제공합니다.

이제 혼란스러운 것은 서로 다른 컨텍스트와 특정 용도의 선언입니다. 간단하게하려면 Android 프레임 워크에서 사용할 수있는 두 가지 유형의 컨텍스트를 계산해야합니다.

  1. 애플리케이션 컨텍스트
  2. 활동 컨텍스트

응용 프로그램 컨텍스트는 응용 프로그램의 수명주기에 연결되며 응용 프로그램 수명 내내 항상 동일합니다. 따라서 Toast 를 사용하는 경우 애플리케이션 컨텍스트 또는 활동 컨텍스트 (둘 다)를 사용할 수 있습니다. 토스트는 애플리케이션의 어느 곳에서나 발생할 수 있고 창에 연결되지 않기 때문입니다.

활동 컨텍스트는 활동의 수명주기에 연결되며 활동 onDestroy()이 발생 하면 소멸 될 수 있습니다 . 새 활동을 시작 하려면 새로운 시작 활동이 현재 활동 (활동 스택 측면에서)에 연결되도록 해당 인 텐트 에서 활동의 컨텍스트를 사용해야합니다 . 그러나 애플리케이션의 컨텍스트를 사용하여 새 활동을 시작할 수도 있지만이를 Intent.FLAG_ACTIVITY_NEW_TASK새 작업으로 처리하려면 인 텐트에 플래그를 설정해야합니다 .

이제 귀하의 사례를 참조하십시오.

LoginActivity.this Activity 클래스를 확장하는 자체 클래스를 참조하지만 기본 클래스 (Activity)도 Context 클래스를 확장하므로 활동 컨텍스트를 제공하는 데 사용할 수 있습니다.

getApplication() Application 객체를 참조하지만 Application 클래스는 Context 클래스를 확장하므로 응용 프로그램 컨텍스트를 제공하는 데 사용할 수 있습니다.

getApplicationContext() 응용 프로그램 컨텍스트를 제공합니다.

getBaseContext() 활동 컨텍스트를 제공합니다.

팁 : 조작해야 할 때마다 Activity-ContextViews 로 이동하십시오 . 그렇지 않으면 Application-Context 로 충분합니다.


11
그래서 내가 올바르게하면 someClass.this, getBaseContext 및 getContext ()는 활동 contexes이고 getApplicationContext () 및 getApplication ()은 응용 프로그램 contexes입니까?
Pheonix7 2012

컨텍스트는 환경에 대한 정보 일 뿐이죠?
committedandroider

예, 애플리케이션을 호스팅하는 샌드 박스와 같습니다.
waqaslam 2014

@committedandroider 활동 컨텍스트에는 선택한 테마에 대한 추가 정보가 포함되어 있으므로 코드에서 뷰가 생성되면 올바른 테마가 자동으로 적용됩니다. 더 많은 정보를 원하시면 이것을
waqaslam 2014

@waqaslam은 android sdk 클래스를 참조합니다 Context.-> ContextWrapper-> 1. Application& 2 ContextThemeWrapper.-> Activity; 과 getBaseContext()의 방법이다 ContextWrapper, 그래서 getBaseContext() offers activity context.뿐만 아니라 Application Context그 ... 너무하지 않습니까?
Bhuro

26

Waqas의 답변은 매우 명확하고 완전하지만 thisvs. getBaseContext()또는 getApplication()vs. 사용의 차이점을 더 명확히하고 싶습니다 getApplicationContext(). 둘 다 ActivityApplication확장 Context자체는 아니지만 ContextWrapper,

"프록시 구현은 Context단순히 모든 호출을 다른 사람에게 위임합니다 Context."

그 "실제"컨텍스트는를 사용하여 얻는 것 getBaseContext()입니다.

따라서 this(for Activity) 및 getBaseContext()둘 다 활동 컨텍스트를 제공 하지만

  • (a) 동일한 객체를 참조하지 마십시오 ( this != getBaseContext()) 및
  • (b) 호출 this이 추가 수준의 간접을 거치기 때문에 컨텍스트 호출 은 약간 덜 효율적입니다. 하지만 실제적인 차이는 없을 것 같습니다.

동일한 논리가 getApplication()getApplicationContext().


지금까지처럼 getBaseContext()"당신이 가지고있는 컨텍스트를 사용 getBaseContext ()를 사용하지 마십시오."우려, 구글의 안드로이드 개발자는이 제안 따라서 실제로 this활동에 사용 하는 것이 좋습니다 .
ChuongPham

이것이 getBaseContext제가 인터넷에서 찾은 가장 명확한 설명입니다 . 감사!!
q126y jul

6
LoginActivity.this 

위의 줄은 확실히 컨텍스트 인 Activity입니다. 이것은 AlertDialogs를 만들 때 사용됩니다. 어떤 곳에서는 Activity Context를 사용해야합니다.

getApplication()

여기서와 동일하게 make text 메서드에는 컨텍스트가 필요하고 응용 프로그램 자체가 구현합니다. Context

getApplicationContext()

이것은 Context응용 프로그램이 종료 될 때까지 유지 되기 때문에 가장 선호되는 방법 입니다.

getBaseContext()

이 컨텍스트는 위젯 및 뷰에서 사용할 수 있습니다.

그러나 그들 모두는 Context 객체를 제공하고 다른 것은 없습니다 ..


그래서 토스트 메시지에서 또는 의도를 만들 때 getApplicationContext ()를 사용하는 것이 가장 정확하지만 모두 동일한 효과가 있습니까?
Pheonix7 2012

1
@Hassan Samii : 토스트의 경우 getApplicationContext()모든 상황에 사용할 수 있지만 this활동에서 토스트를 만들 때 사용하는 것이 좋습니다 .
ChuongPham

0

Class. 이것은 클래스가 Activity를 확장하는 경우 사용됩니다. getapplication ()은 응용 프로그램을 참조하고 응용 프로그램은 응용 프로그램 컨텍스트를 확장합니다. getbasecontext () 활동 컨텍스트 컨텍스트를 참조합니다. 활동 수명주기 컨텍스트를 참조합니다. applicationcontext는 앱 수명주기를 참조합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.