앱의 규모가 커지고 여러가지 내부 로직/기능이 추가되다보면 전체 애플리케이션 라이프사이클 동안 하나의 인스턴스만 유지될 필요가 있는 클래스들이 늘어나게 됩니다. 그렇다고 이러한 공통모듈 성격의 클래스들에 싱글턴 패턴을 일일이 적용하는 것은 그리 좋은 방법은 아닙니다.
Spring프레임워크를 써보신 분은 다 아시겠지만 스프링에는 빈들을 체계적으로 생성해서 관리해주는 BeanFactory라는 놈이 있습니다. 안드로이드에서도 이러한 bean들의 컨테이너 역할을 하는 뭔가가 있으면 좋겠다고 생각해서 안드로이드에 Spring 프레임워크를 포함시키면 자칫 배보다 배꼽이 커질 수 있습니다.
다행히 안드로이드에는 android.app.Application 클래스가 있어서 이러한 컨테이너 역할을 수행하게 할 수 있습니다.
android.app.Application 클래스
이 클래스는 액티비티들보다 좀더 상위레벨 라이프사이클을 갖는 클래스라고 볼 수 있습니다. 우리는 이 클래스를 상속받아 간단하게나마 여러 컴포넌트의 인스턴스를 초기화하고 (하나의 인스턴스만 유지되도록) 관리할 수 있습니다.
나만의 Application 만들기
사용법
이제 Activity든 어디든 MyComponent 인스턴스가 필요하다면 아래와 같이 불러다 쓰면 됩니다.
주의점
개발자가 임의로 MyComponent의 인스턴스를 생성하지 않도록 적절히 가이드해야합니다. 가이드가 잘 안지켜지면 MyApplication과 MyComponent를 별도의 패키지로 분리하고 MyComponent 생성자에 대한 접근자를 default로 만들수도 있습니다.
참고
http://stackoverflow.com/questions/987072/using-application-context-everywhere
Spring프레임워크를 써보신 분은 다 아시겠지만 스프링에는 빈들을 체계적으로 생성해서 관리해주는 BeanFactory라는 놈이 있습니다. 안드로이드에서도 이러한 bean들의 컨테이너 역할을 하는 뭔가가 있으면 좋겠다고 생각해서 안드로이드에 Spring 프레임워크를 포함시키면 자칫 배보다 배꼽이 커질 수 있습니다.
다행히 안드로이드에는 android.app.Application 클래스가 있어서 이러한 컨테이너 역할을 수행하게 할 수 있습니다.
android.app.Application 클래스
이 클래스는 액티비티들보다 좀더 상위레벨 라이프사이클을 갖는 클래스라고 볼 수 있습니다. 우리는 이 클래스를 상속받아 간단하게나마 여러 컴포넌트의 인스턴스를 초기화하고 (하나의 인스턴스만 유지되도록) 관리할 수 있습니다.
나만의 Application 만들기
먼저 android.app.Application 클래스를 상속받아 우리만의 MyApplication을 만듭니다. 그리고 onCreate()에서 싱글턴으로 존재하길 원하는 객체를 생성합니다.
매니페스트에 Application 등록
이렇게 만든 MyApplication을 매니페스트 파일에 등록해두면 MyApplication은 앱 실행시 다른 액티비티들보다 가장 먼저 먼저 초기화됩니다.
따라서 MyApplication의 onCreate()메소드는 애플리케이션의 entry point에 해당하므로 공통컴포넌트들을 초기화할 수 있는 적당한 장소가 됩니다.
public class MyApplication extends Application {
private static Context context;
private static MyComponent myComponent;
... ...
... ...
public void onCreate() {
MyApplication.context = getApplicationContext();
MyApplication.myComponent = new MyComponent(MyApplication.context);
... ....
... ....
}
... ...
/**
* Activity와 관계없는 컴포넌트에서 부득이 Application Context를 참조하기 위한 용도.
* Activity에 대한 참조가 가능한 티어에서는 굳이 이 메소드를 통해 context를 구하지 않아도 된다.
*/
public static Context getAppContext() {
return context;
}
public static MyComponent getMyComponent() {
return myComponent;
} ... ...
매니페스트에 Application 등록
따라서 MyApplication의 onCreate()메소드는 애플리케이션의 entry point에 해당하므로 공통컴포넌트들을 초기화할 수 있는 적당한 장소가 됩니다.
<application
android:icon="@drawable/icon"
android:label="@string/app_name"
android:name="myapp.MyApplication">
<activity android:name=".xxx.MyActivity">
… …
… …
</application>
사용법
이제 Activity든 어디든 MyComponent 인스턴스가 필요하다면 아래와 같이 불러다 쓰면 됩니다.
SomeResult result = MyApplication.getMyComponent().someMethod();
주의점
개발자가 임의로 MyComponent의 인스턴스를 생성하지 않도록 적절히 가이드해야합니다. 가이드가 잘 안지켜지면 MyApplication과 MyComponent를 별도의 패키지로 분리하고 MyComponent 생성자에 대한 접근자를 default로 만들수도 있습니다.
참고
http://stackoverflow.com/questions/987072/using-application-context-everywhere
http://code.google.com/p/roboguice/ : 좀더 그럴듯한 빈컨테이너(Dependency Injection 지원)
'Android' 카테고리의 다른 글
[안드로이드] WebView와 웹서버간 HTTP 통신내용 엿보기 (0) | 2011.07.14 |
---|---|
[안드로이드] Ant로 앱빌드시 서명용 비밀번호 자동입력 (0) | 2011.07.09 |
[안드로이드] 향상된 AsyncTask 공개 (2) | 2011.06.27 |
[안드로이드] PhoneGap 앱에서 신뢰할 수 없는 https 웹페이지 로딩하기 (0) | 2011.06.27 |
[안드로이드] PhoneGap 앱에서 취소키 누르면 앱 종료하기 (0) | 2011.06.27 |