차이점은 무엇이며 getContext()
, getApplicationContext()
, getBaseContext()
,와 " this
"는?
이것은 간단한 질문이지만 기본적인 차이점을 이해할 수 없습니다. 가능한 경우 몇 가지 쉬운 예를 제시하십시오.
차이점은 무엇이며 getContext()
, getApplicationContext()
, getBaseContext()
,와 " this
"는?
이것은 간단한 질문이지만 기본적인 차이점을 이해할 수 없습니다. 가능한 경우 몇 가지 쉬운 예를 제시하십시오.
답변:
View.getContext()
:보기가 현재 실행중인 컨텍스트를 리턴합니다. 일반적으로 현재 활성 인 활동입니다.
Activity.getApplicationContext()
: 전체 애플리케이션의 컨텍스트를 리턴합니다 (모든 활동이 내부에서 실행중인 프로세스). 현재 활동뿐만 아니라 전체 애플리케이션의 라이프 사이클과 연관된 컨텍스트가 필요한 경우 현재 활동 컨텍스트 대신이를 사용하십시오.
ContextWrapper.getBaseContext()
: 다른 컨텍스트 내에서 컨텍스트에 액세스해야하는 경우 ContextWrapper를 사용합니다. 해당 ContextWrapper 내부에서 참조 된 컨텍스트는 getBaseContext ()를 통해 액세스됩니다.
this
및 getContext()
활동 클래스입니다 항상 같은 예를 들어, 당신은 사용할 수 this
있기 때문에 Activity
에서 상속 Context
하지만 방법이 getContext()
아닌 Activity
클래스입니다. @mikedroid @KCRaju
대부분의 답변은 이미 포함 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();
}
}
}
ContextWrapper
가 Android 프레임 워크 개발자가 내린 최악의 결정 중 하나 라고 말합니다 . 그들이 옳은 일을하고 단일 책임에 대한 코드를 리팩토링하는 대신에 신 객체의 전체 패밀리를 만들었다는 것을 깨달았을 때, 상속 트리를 심화하여 컨텍스트 동작을 변경할 수있는 추한 해킹을 추가했습니다. 최악의 소프트웨어 엔지니어링. 우리에 관해서는, 개발자, 아무도 사용 안 이럴 getBaseContext()
나 ContextWrapper
. 당신이 할 경우-그것은 거대한 "코드 냄새"입니다.
CustomToast
코드 를보고 싶습니다 . THANKS :)))
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 | +----------------------------+-------------+----------+---------+-----------------+-------------------+
- 애플리케이션은 여기에서 활동을 시작할 수 있지만 새 태스크를 작성해야합니다. 이는 특정 사용 사례에 맞을 수 있지만 응용 프로그램에서 비표준 백 스택 동작을 만들 수 있으며 일반적으로 권장되거나 권장되지 않습니다.
- 이것은 합법적이지만 인플레이션은 애플리케이션에 정의 된 것이 아니라 실행중인 시스템의 기본 테마로 수행됩니다.
- Android 4.2 이상에서 고정 브로드 캐스트의 현재 값을 얻는 데 사용되는 수신자가 널인 경우 허용됩니다.
Context
Actvity
또는 Application
새로 작성된 구성 요소 에 대한 정보를 제공합니다 .
Context
새로 작성된 구성 요소 (응용 프로그램 컨텍스트 또는 활동 컨텍스트)와 관련이 있어야합니다.
Activity
의 하위 클래스 이므로 해당 활동의 컨텍스트를 얻는 데 Context
사용할 수 있습니다.this
A Context
는 :