본문 바로가기

Android

[Android] Context

안녕하세요. 메로나입니다.

 

오늘은 안드로이드 개발을 하면서 제일 많이 사용하지만 왜 필요한지 알고 싶은 Context를 공부하겠습니다.

 

Context
  • 안드로이드에서 Context는 애플리케이션 환경에 대한 정보를 제공하는 인터페이스입니다.
  • 리소스에 접근하거나 브로드캐스트를 보내거나 서비스 등을 시작할 수 있습니다.
Application Context
  • 애플리케이션의 전역 Context를 반환합니다.
  • 애플리케이션의 수명 주기와 함께하며, 액티비티나 다른 UI 요소의 수명 주기와는 독립적입니다.
  • UI와 관련되지 않은 작업이나 장기적인 프로세스에 적합합니다.
  • 레이아웃을 인플레이트하거나 다이얼로그를 표시하는 등 UI와 관련된 작업에는 부적절합니다.
Activity Context
  • 프래그먼트에서 호출
  • 해당 프래그먼트를 호스팅 하는 액티비티의 Context를 반환합니다.
  • 액티비티의 리소스에 접근하거나 액티비티와 상호작용할 수 있습니다.
  • 해당 액티비티의 생명주기와 함께 합니다.
  • 액티비티 내에서 this 키워드를 사용하여 접근할 수 있으며, UI와 관련된 작업을 주로 합니다.
메모리 누수를 방지하는 방법
  • 적절한 Context 사용: 가능하면 Application Context를 사용하고, 액티비티의 Context를 장기적으로 보관하지 않도록 합니다. 특히 싱글톤이나 장기적인 객체에서 액티비티의 Context를 유지하면 메모리 누수가 발생할 수 있습니다.
  • 리스너와 콜백 해제: 브로드캐스트 리시버, 리스너, 콜백 등을 등록한 후에는 반드시 적절한 시점에 해제해야 합니다. 그렇지 않으면 해당 객체들이 계속 메모리에 유지되어 누수가 발생할 수 있습니다. 예를 들어 onPoush(), onDestroy()에서 리스너를 해제하는 것이 좋습니다.
  • 정적 변수 사용 주의: 정적 변수에 액티비티나 뷰의 참조를 저장하면 해당 객체들이 가비지 컬렉션되지 않아 메모리 누수가 발생할 수 있습니다. 이러한 경우에는 WeakReference를 사용하여 약한 참조를 유지하는 것이 좋습니다.
  • AsyncTask와 스레드 관리: 백그라운드 작업을 수행하는 AsyncTask나 스레드를 사용할 때, 액티비티가 종료되었음에도 작업이 계속 진행되면 메모리 누수가 발생할 수 있습니다. 액티비티의 onDestroy()에서 해당 작업을 취소하거나 중지하는 것이 중요합니다.
예시!
public class MySingleton {
    private static MySingleton instance;
    private Context context;

    private MySingleton(Context context) {
        // 애플리케이션 컨텍스트 사용
        this.context = context.getApplicationContext();
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (instance == null) {
            instance = new MySingleton(context);
        }
        return instance;
    }
}
public class MyActivity extends AppCompatActivity {
    private static class MyHandler extends Handler {
        private final WeakReference<MyActivity> activityReference;

        MyHandler(MyActivity activity) {
            activityReference = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MyActivity activity = activityReference.get();
            if (activity != null) {
                // 메시지 처리
            }
        }
    }

    private final MyHandler handler = new MyHandler(this);
}

 

Context를 잘못 사용 하면 앱이 종료되거나 앱의 기능이 동작을 안 하는 경우가 많았습니다.

조금이라도 알고 사용하고자 공부를 하였습니다.

쓰임에 따라 Context를 잘 골라 사용하겠습니다.