getContext (), getApplicationContext (), getBaseContext () 및“this”의 차이점 질문이지만 기본적인 차이점을 이해할

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

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



답변

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

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

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


답변

대부분의 답변은 이미 포함 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();
    }
  }
}

답변

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

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

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


답변

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

컨텍스트는 시스템 리소스에 액세스하고, 애플리케이션의 정적 자산을 검색하고, 권한을 확인하고, 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 이상에서 고정 브로드 캐스트의 현재 값을 얻는 데 사용되는 수신자가 널인 경우 허용됩니다.


답변

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

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

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


답변

문서에서

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

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


답변

getApplicationContext ()

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

getContext () 및 getBaseContext ()

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

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