getContext (), getApplicationContext (), getBaseContext () 및“this”의 차이점


565

차이점은 무엇이며 getContext(), getApplicationContext(), getBaseContext(),와 " this"는?

이것은 간단한 질문이지만 기본적인 차이점을 이해할 수 없습니다. 가능한 경우 몇 가지 쉬운 예를 제시하십시오.


1
첫 번째 답변에는 훌륭한 글이 있습니다 : stackoverflow.com/questions/1026973/…
ky1enamic

답변:


528
  • View.getContext():보기가 현재 실행중인 컨텍스트를 리턴합니다. 일반적으로 현재 활성 인 활동입니다.

  • Activity.getApplicationContext(): 전체 애플리케이션의 컨텍스트를 리턴합니다 (모든 활동이 내부에서 실행중인 프로세스). 현재 활동뿐만 아니라 전체 애플리케이션의 라이프 사이클과 연관된 컨텍스트가 필요한 경우 현재 활동 컨텍스트 대신이를 사용하십시오.

  • ContextWrapper.getBaseContext(): 다른 컨텍스트 내에서 컨텍스트에 액세스해야하는 경우 ContextWrapper를 사용합니다. 해당 ContextWrapper 내부에서 참조 된 컨텍스트는 getBaseContext ()를 통해 액세스됩니다.


59
그리고 "this"는 어떻습니까?
CooL i3oY

16
+ CooL i3oY getContext와 동일
Mikey

13
실제로 나는 문맥의 적절한 정의가 무엇인지 혼동하고 있습니까?
Ravi

11
"this"와 getContext ()는 동일합니다
KCRaju 1

43
thisgetContext()활동 클래스입니다 항상 같은 예를 들어, 당신은 사용할 수 this있기 때문에 Activity에서 상속 Context하지만 방법이 getContext()아닌 Activity클래스입니다. @mikedroid @KCRaju
nandan

92

대부분의 답변은 이미 포함 getContext()하고 getApplicationContext()있지만, getBaseContext ()는 거의 설명하지 않습니다.

이 방법 getBaseContext()은을 보유한 경우에만 관련이 있습니다 ContextWrapper. Android는 다음을 사용하여 ContextWrapper기존 클래스 주위에 생성 되는 클래스를 제공합니다 Context.

ContextWrapper wrapper = new ContextWrapper(context);

a ContextWrapper를 사용하면 "원본 컨텍스트를 변경하지 않고 동작을 수정할 수 있습니다" 라는 이점이 있습니다. 예를 들어, 활동이라는 경우 myActivity다음 View과 다른 테마로을 만들 수 있습니다 myActivity.

ContextWrapper customTheme = new ContextWrapper(myActivity) {
  @Override
  public Resources.Theme getTheme() { 
    return someTheme;
  }
}
View myView = new MyView(customTheme);

ContextWrapper당신이에서 제공하는 대부분의 기능을 재정의 할 수 있기 때문에 정말 강력한 Context리소스에 액세스 코드를 포함하여 (예를 들어 openFileInput(), getString()), 다른 구성 요소와 상호 작용 (예를 들어 sendBroadcast(), registerReceiver()), 요청 권한 (예 checkCallingOrSelfPermission()) 및 해결 파일 시스템 위치 (예를 들면 getFilesDir()). ContextWrapper장치 / 버전 별 문제를 해결하거나 컨텍스트가 필요한 뷰와 같은 구성 요소에 일회성 사용자 지정을 적용하는 데 정말 유용합니다.

getBaseContext () 메소드를 사용하여 ContextWrapper랩 하는 "기본"컨텍스트에 액세스 할 수 있습니다 . 당신은, 예를 들어,이 있는지 여부를 확인해야하는 경우는 "기본"컨텍스트에 액세스해야 할 수도 있습니다 Service, Activity또는 Application:

public class CustomToast {
  public void makeText(Context context, int resId, int duration) {
    while (context instanceof ContextWrapper) {
      context = context.baseContext();
    }
    if (context instanceof Service)) {
      throw new RuntimeException("Cannot call this from a service");
    }
    ...
  }
}

또는 "랩핑되지 않은"버전의 메소드를 호출해야하는 경우 :

class MyCustomWrapper extends ContextWrapper {
  @Override
  public Drawable getWallpaper() {
    if (BuildInfo.DEBUG) {
      return mDebugBackground;
    } else {
      return getBaseContext().getWallpaper();
    }
  }
}

17
나는 이것이 수락 된 후 가장 중요한 대답이라고 말할 것입니다.
0leg

4
나는 존재 ContextWrapper가 Android 프레임 워크 개발자가 내린 최악의 결정 중 하나 라고 말합니다 . 그들이 옳은 일을하고 단일 책임에 대한 코드를 리팩토링하는 대신에 신 객체의 전체 패밀리를 만들었다는 것을 깨달았을 때, 상속 트리를 심화하여 컨텍스트 동작을 변경할 수있는 추한 해킹을 추가했습니다. 최악의 소프트웨어 엔지니어링. 우리에 관해서는, 개발자, 아무도 사용 안 이럴 getBaseContext()ContextWrapper. 당신이 할 경우-그것은 거대한 "코드 냄새"입니다.
Vasiliy

완전한 CustomToast코드 를보고 싶습니다 . THANKS :)))
Alston

39

getApplicationContext () -애플리케이션에서 실행중인 모든 활동에 대한 컨텍스트를 리턴합니다.

getBaseContext () -응용 프로그램 내의 다른 컨텍스트에서 컨텍스트에 액세스하려는 경우 액세스 할 수 있습니다.

getContext () -현재 실행중인 활동 만 컨텍스트보기를 리턴합니다.


1
Pls는 문자 A와 B를 컨텍스트가있는 컨텍스트 정의에 통합하므로 어떤 컨텍스트에 액세스하는지 명확하지 않습니다.
희망적으로 도움이 된

29

"컨텍스트가 무엇인가"라는 질문은 안드로이드 세계에서 가장 어려운 질문 중 하나입니다.

컨텍스트는 시스템 리소스에 액세스하고, 애플리케이션의 정적 자산을 검색하고, 권한을 확인하고, UI 조작 등을 수행하는 메소드를 정의합니다. 본질적으로, Context생산에서 신의 대상 반 패턴의 예입니다.

Context우리 가 어떤 종류의 것을 사용해야하는지에 관해서는 신 객체를 제외하고는 Context하위 클래스 의 계층 구조 트리가 Liskov 대체 원칙을 무자비하게 위반 하기 때문에 매우 복잡해집니다 .

이 블로그 게시물Context 은 다양한 상황에서 클래스 적용 가능성 을 요약하려고 시도합니다 .

완성을 위해 해당 게시물의 기본 테이블을 복사하겠습니다.

+----------------------------+-------------+----------+---------+-----------------+-------------------+
|                            | Application | Activity | Service | ContentProvider | BroadcastReceiver |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
| Show a Dialog              | NO          | YES      | NO      | NO              | NO                |
| Start an Activity          | NO¹         | YES      | NO¹     | NO¹             | NO¹               |
| Layout Inflation           | NO²         | YES      | NO²     | NO²             | NO²               |
| Start a Service            | YES         | YES      | YES     | YES             | YES               |
| Bind to a Service          | YES         | YES      | YES     | YES             | NO                |
| Send a Broadcast           | YES         | YES      | YES     | YES             | YES               |
| Register BroadcastReceiver | YES         | YES      | YES     | YES             | NO³               |
| Load Resource Values       | YES         | YES      | YES     | YES             | YES               |
+----------------------------+-------------+----------+---------+-----------------+-------------------+
  1. 애플리케이션은 여기에서 활동을 시작할 수 있지만 새 태스크를 작성해야합니다. 이는 특정 사용 사례에 맞을 수 있지만 응용 프로그램에서 비표준 백 스택 동작을 만들 수 있으며 일반적으로 권장되거나 권장되지 않습니다.
  2. 이것은 합법적이지만 인플레이션은 애플리케이션에 정의 된 것이 아니라 실행중인 시스템의 기본 테마로 수행됩니다.
  3. Android 4.2 이상에서 고정 브로드 캐스트의 현재 값을 얻는 데 사용되는 수신자가 널인 경우 허용됩니다.

스크린 샷


당신이 링크 한 훌륭한 블로그 게시물!
lejonl

28

ContextActvity또는 Application새로 작성된 구성 요소 에 대한 정보를 제공합니다 .

Context새로 작성된 구성 요소 (응용 프로그램 컨텍스트 또는 활동 컨텍스트)와 관련이 있어야합니다.

Activity의 하위 클래스 이므로 해당 활동의 컨텍스트를 얻는 데 Context사용할 수 있습니다.this


baseContext에 대한 설명은 어디에 있습니까?
IgorGanapolsky

1

문서에서

나는 당신이 사용해야한다는 것을 이해했습니다 :

컨텍스트 활동 대신 컨텍스트 애플리케이션을 사용해보십시오.


0

getApplicationContext ()

이것은 응용 프로그램 수준에 사용되며 모든 활동을 나타냅니다.

getContext () 및 getBaseContext ()

아마도 현재와 똑같을 것입니다. 이들은 현재 진행중인 활동 만 나타냅니다.

항상 현재 클래스 객체를 참조합니다.


0

A Context는 :

  • 안드로이드 시스템에 의해 구현되는 추상 클래스
  • 응용 프로그램 별 리소스 및 클래스에 대한 액세스는 물론 활동 시작, 방송 및 수신 의도 등과 같은 응용 프로그램 수준 작업을위한 업 콜에 액세스 할 수 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.