programing

getContext(), getApplicationContext(), getBaseContext() 및 "이것"의 차이

showcode 2023. 6. 4. 10:44
반응형

getContext(), getApplicationContext(), getBaseContext() 및 "이것"의 차이

사이의 차이점은 무엇입니까?getContext(),getApplicationContext(),getBaseContext()그리고 "this"?

이것은 간단한 질문이지만 저는 그들 사이의 기본적인 차이를 이해할 수 없습니다.가능하면 쉬운 예를 들어주시기 바랍니다.

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

  • Activity.getApplicationContext()전체 응용프로그램(모든 활동이 실행되는 프로세스)의 컨텍스트를 반환합니다.현재 활동뿐만 아니라 전체 응용프로그램의 라이프사이클에 연결된 컨텍스트가 필요한 경우 현재 활동 컨텍스트 대신 이 컨텍스트를 사용합니다.

  • ContextWrapper.getBaseContext()다른 컨텍스트 내에서 컨텍스트에 대한 액세스가 필요한 경우 컨텍스트 래퍼를 사용합니다.컨텍스트 래퍼가 getBaseContext()를 통해 액세스하는 내부에서 참조되는 컨텍스트입니다.

대부분의 답변은 이미 다룹니다.getContext()그리고.getApplicationContext()그러나 getBaseContext()는 거의 설명되지 않습니다.

»getBaseContext()당신이 가지고 있을 때만 관련이 있습니다.ContextWrapper는 Android 다음제다니합는을 합니다.ContextWrapper 기주위만클래스진어들을 Context매개 변수:

ContextWrapper wrapper = new ContextWrapper(context);

ContextWrapper, " 컨텍스트를 수 있습니다.", ""래할원컨텍수동정을작않다"입니다.예를 들어, 다음과 같은 활동이 있는 경우myActivity그러면 생성할 수 있습니다.View▁than로와는 다른 myActivity:

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

ContextWrapper에서 제공하는 대부분의 기능을 재정의할 수 있기 때문에 매우 강력합니다.Context 리에액기예위포코함니다합를드한하스세소스예▁to(:):openFileInput(),getString() 요소 )와 작용합니다.sendBroadcast(),registerReceiver(): ), 을(를) 수행합니다checkCallingOrSelfPermission()) 및위치 파일 시스템 위치 확인:getFilesDir()).ContextWrapper장치/버전 관련 문제를 해결하거나 컨텍스트가 필요한 View와 같은 구성 요소에 일회성 사용자 지정을 적용하는 데 매우 유용합니다.

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

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

컨텍스트는 시스템 리소스에 액세스하고, 애플리케이션의 정적 자산을 검색하고, 권한을 확인하고, UI 조작을 수행하는 등의 방법을 정의합니다. 적으로본질,ContextGod Object 안티패턴의 생산 사례입니다.

어떤 종류의 것에 관한 한.Context해야 하는 은, 신을 제외하고는, 우가사야한다면매복다, 은우집니해잡그의 트리이기 . 왜냐하면 신의 객체, 계층 트리가 되는 것을 제외하고는.Context하위 클래스는 Liskov 대체 원칙을 잔인하게 위반합니다.

이 블로그 게시물(현재 Wayback Machine에서 제공)은 요약을 시도합니다.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 이상에서 수신기가 null인 경우 허용되며, 이는 고정 브로드캐스트의 현재 값을 얻는 데 사용됩니다.

스크린샷

getApplicationContext() - 응용 프로그램에서 실행 중인 모든 활동의 컨텍스트를 반환합니다.

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

getContext() - 컨텍스트 보기만 현재 실행 중인 활동을 반환합니다.

Context에는 에 가 나와 있습니다.Actvity또는Application새로 생성된 구성 요소로 이동합니다.

Context새로 생성된 구성 요소(애플리케이션 컨텍스트 또는 활동 컨텍스트)에 제공되어야 합니다.

때부터Activity의 하위 클래스입니다.Context .this활동의 ▁to위해기▁get'.

응용 프로그램 컨텍스트 가져오기()

응용 프로그램 수준에 사용되며 모든 활동을 참조합니다.

getContext() 및 getBaseContext()

거의 동일할 수 있습니다. 이것들은 현재 활성 상태인 활동만 참조됩니다.

이것.

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

이: 현재 클래스 개체

getContext(): 현재 실시간 활동에 대한 컨텍스트 반환

getApplicationContext(): 응용 프로그램에서 실행 중인 모든 활동을 반환합니다.

문서에서

다음을 사용해야 한다는 것을 이해했습니다.

컨텍스트 작업 대신 컨텍스트 응용 프로그램을 사용해 보십시오.

A Context다음과 같습니다.

  • Android 시스템에서 구현을 제공하는 추상 클래스입니다.
  • 애플리케이션별 리소스 및 클래스에 액세스할 수 있으며, 시작 활동, 브로드캐스트 및 수신 의도 등과 같은 애플리케이션 수준 운영에 대한 업콜도 가능합니다.

getApplicationContext() - 응용 프로그램에서 실행 중인 모든 활동에 대한 컨텍스트를 반환합니다.

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

getContext() - 컨텍스트 뷰만 현재 실행 중인 활동을 반환합니다.

이것 - 현재 클래스 개체를 나타냅니다.

이것은 현재 활동 클래스 개체를 나타내며 활동은 컨텍스트를 상속하므로 컨텍스트 또는 활동을 사용할 수 있는 곳에서 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/10641144/difference-between-getcontext-getapplicationcontext-getbasecontext-and

반응형