getapplicationContext (), getBaseContext (), getApplication (), getParent () 차이 및 context 의 최종 해석

5520 단어 android
먼저 이 네 함수 의 차 이 를 말 하고 그 다음 에 제 가 context 에 대한 이해 차 이 는 다음 과 같 습 니 다.
링크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 가 필요 하 다 면 연락 주세요.

좋은 웹페이지 즐겨찾기