안녕하세요. 메로나입니다.
오늘은 안드로이드 개발을 하면서 제일 많이 사용하지만 왜 필요한지 알고 싶은 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를 잘 골라 사용하겠습니다.
'Android' 카테고리의 다른 글
| [Android] ImageView의 scaleType 속성 (0) | 2025.05.08 |
|---|---|
| [Android] NDK(Native Development Kit) (0) | 2025.04.06 |
| [Android] AOSP(Android Open Source Project) (0) | 2025.03.07 |
| [Android] 안드로이드 리다이렉션 처리 (0) | 2025.02.28 |
| [Android] 미디어 프로젝션(Media Projection) (0) | 2025.02.27 |