getapplicationContext (), getBaseContext (), getApplication (), getParent () 차이 및 context 의 최종 해석
5520 단어 android
링크http://stackoverflow.com/questions/6854265/getapplicationcontext-getbasecontext-getapplication-getparent
번역 + 나의 총 결 은 다음 과 같다
1. getApplicationContext() :
이 함수 가 되 돌아 오 는 이 애플 리 케 이 션 의 컨 텍스트 이기 때문에 app 과 연결 되 어 있 기 때문에 전체 수명 주기 에 변 하지 않 습 니 다. 이것 은 이해 하기 쉽 습 니 다. 그러나 사용 할 때 이 context 는 인 용 된 수명 주기 와 일치 하기 때문에 activity 수명 주기 와 연 결 된 작업 은 이 context 를 사용 하지 마 십시오. 예 를 들 어 네트워크 접근, 메모리 유출 방지 등 입 니 다.
2. getBasecontext():
stackoverflow 에 적 힌 것 은 이 함수 가 사용 되 어 서 는 안 되 고 Context 로 대체 되 어야 하 며 Context 는 activity 와 관련 되 어 있 기 때문에 activity 가 사망 하면 destroyed 될 수 있 습 니 다. 제 가 쓴 예 를 들 어 보 겠 습 니 다.
public Dialog displayDialog(int choice)
{
switch(choice){
case 0:
AlertDialog aDialog = new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("Hello World")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Toast.makeText(getBaseContext(), "OK clicked", Toast.LENGTH_SHORT).show();
}
}).......
이 예 에서 getBaseContext () 는 this 로 대체 할 수 없습니다. 위의 this 는 이 activity 의 context 를 되 돌려 주 고 이 onClick 함수 에서 this 를 사용 하면 이 AlertDialog 의 context 를 되 돌려 줍 니 다. 따라서 현재 activity 이름. this 를 사용 해 야 합 니 다. 예 를 들 어 현재 activity 는 TestActivity 입 니 다.그러면 안에 서 는 TestActivity. this 를 사용 하 시 면 됩 니 다.
3. getApplication():
getapplication 은 Activity 와 Services 에서 만 사용 할 수 있 습 니 다. 현재 안 드 로 이 드 구현 에서 getapplication 과 getapplicationContext 는 같은 대상 으로 돌아 갈 수 있 지만 이 두 함수 가 같다 는 보장 은 없습니다. (예 를 들 어 특수 공급 자 에 게) 그래서 Manifest 파일 에 등 록 된 App class 를 원한 다 면 getapplicationContext 를 호출 하지 마 십시오.당신 이 원 하 는 app 인 스 턴 스 를 얻 지 못 할 것 이 라 고 생각 합 니 다.
번역 완료, 한눈 에 알 수 있 습 니 다.
getApplication() is available to Activity and Services only. Although in current Android Activity and Service implementations, getApplication() and getApplicationContext() return the same object, there is no guarantee that this will always be the case (for example, in a specific vendor implementation). So if you want the Application class you registered in the Manifest, you should never call getApplicationContext() and cast it to your application, because it may not be the application instance (which you obviously experienced with the test framework).
4. getParent() :
activity 의 컨 텍스트 를 되 돌려 줍 니 다. 이 하위 보기 라면 하위 보기에 서 호출 되면 하위 보기 가 있 는 activity 대상 을 되 돌려 줍 니 다. 한눈 에 알 수 있 습 니 다.
5.getActivity():
fragment 에서 사용 하면 이 fragment 에 의존 하 는 activity 컨 텍스트 를 되 돌려 줍 니 다.
6.this
Activity, Service 류, Application 류 는 Context 류 에서 계승 되 기 때문에 문맥 이 필요 할 때 this 키워드 만 사용 하면 됩 니 다. 그러나 가끔 스 레 드 에 this 키워드 의 의미 가 바 뀌 지만 이 럴 때 상하 문 이 필요 하 다 면 클래스 이름. this 를 사용 하면 됩 니 다. 이렇게 하면 됩 니 다.
context 에 대한 이해
그리고 context 는 이 대상 의 생명 주 기 를 대표 합 니 다. 따라서 하나의 단독 activity 에서 이 activity 의 컨 텍스트 를 사용 하여 view 를 만 들 려 면 이 view 의 생명 주 기 는 이 페이지 와 관련 되 어 있 습 니 다. 이 페이지 의 ondestroy 가 있 으 면 이 페이지 와 관련 된 컨 텍스트 가 삭제 되 어 이 view 가 시스템 에 회수 되 고,그러나 애플 리 케 이 션 context 를 계속 사용 하여 대상 을 만 들 면 대상 이 회수 되 지 않 고 메모리 가 커 집 니 다.
여기 주의 할 점 이 있 습 니 다.
프로젝트 를 할 때 만 났 습 니 다. 말씀 하 세 요. 동적 등록 방송 은 registerBroadcast 함 수 를 호출 할 때 하나의 컨 텍스트 와 broadcastReceiver 를 입력 해 야 합 니 다. 원본 코드 를 보면 알 수 있 습 니 다. 저장 할 때 context 는 하나의 key 역할 을 하기 때문에 같은 context 를 사용 하여 같은 방송 을 등록 해 야 합 니 다. onreceive 는 한 번 만 호출 합 니 다.그러나 서로 다른 context 를 사용 하면 여러 번 호출 됩 니 다. unregister Broadcast 를 사용 하지 않 아 도 괜 찮 을 때 가 있 습 니 다. 잘못 보고 하지 않 지만 로그아웃 취 소 를 잊 지 마 세 요.
후속: context 의 사용 방법 을 간소화 하기 위해 현재 이러한 방법 이 있 습 니 다. 바로 Application 류 에서 약 한 인용 을 유지 하 는 것 입 니 다.
/** Application context */
private static Context instance;
/** context */
private volatile static WeakReference<Context> instanceRef = null;
방법 을 하나 더 쓰 고,
public static Context getInstance(){
if (instanceRef == null || instanceRef.get() == null){
synchronized (RootApplication.class) {
if (instanceRef == null || instanceRef.get() == null) {
Context context = ActivityManager.getInstance().getActivity();
if (context != null)
instanceRef = new WeakReference<>(context);
else {
instanceRef = new WeakReference<>(instance);
L.w(" RootActivity setInstanceRef ");
}
}
}
}
return instanceRef.get();
}
마지막 으로 응 용 된 Activity 기본 클래스 에 두 개의 문 구 를 추가 합 니 다.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RootApplication.setInstanceRef(this);
}
protected void onResume() {
super.onResume();
// onresume ,
RootApplication.setInstanceRef(this);
}
이렇게 매번 application 을 호출 하 는 getInstance () 방법 은 context 로 돌아 갈 수 있 습 니 다. 또한 현재 유일 하 게 볼 수 있 는 activity context 입 니 다. 다른 곳 에서 직접 사용 할 수 있 습 니 다. context 를 여기저기 전달 하지 않 고 여기 서 통일 적 으로 유지 하면 됩 니 다.
안 드 로 이 드 프레임 워 크 를 썼 습 니 다. 안 드 로 이 드 응용 프레임 워 크 에 관 한 라 이브 러 리 와 테스트 클래스 를 사 용 했 습 니 다.https://github.com/zhaozepeng/Android_framework, 안 드 로 이 드 애플 리 케 이 션 에 대한 자신의 생각 을 포함 하고 있 습 니 다. 아직 완성 되 지 않 았 습 니 다. code 가 필요 하 다 면 연락 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.