Details: 앱 시작 시 ContentProvider 사용하여 구성을 초기화하기
ContentProvider
의 또 다른 사용 사례는 앱 시작 시 리소스 또는 구성을 초기화하는 기능입니다. 일반적으로 리소스 또는 라이브러리 초기화는 Application
클래스에서 발생하지만, 책임 분리를 개선하기 위해 이 로직을 별도의 ContentProvider
에 캡슐화할 수 있습니다. 사용자 지정 ContentProvider
를 생성하고 AndroidManifest.xml
에 등록함으로써 초기화 작업을 효율적으로 위임할 수 있습니다.
ContentProvider
의 onCreate()
메서드는 Application.onCreate()
메서드보다 먼저 호출되므로, 이는 조기 초기화를 위한 훌륭한 진입점입니다. 예를 들어, Firebase Android SDK
25는 사용자 지정 ContentProvider
를 사용하여 Firebase SDK
를 자동으로 초기화합니다. 이 접근 방식은 Application
클래스에서 FirebaseApp.initializeApp(this)
를 수동으로 호출할 필요를 없애줍니다.
Firebase의 예시 구현은 다음과 같습니다:
public class FirebaseInitProvider extends ContentProvider {
/** Called before Application.onCreate(). */
@Override
public boolean onCreate() {
try {
currentlyInitializing.set(true);
if (FirebaseApp.initializeApp(getContext()) == null) {
Log.i(TAG, "FirebaseApp initialization unsuccessful");
} else {
Log.i(TAG, "FirebaseApp initialization successful");
}
return false;
} finally {
currentlyInitializing.set(false);
}
}
}
FirebaseInitProvider
는 아래 코드와 같이 XML 파일에 등록됩니다:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!--Although the *SdkVersion is captured in gradle build files, this is required for
non gradle builds-->
<!--<uses-sdk android:minSdkVersion="21"/>-->
<application>
<provider
android:name="com.google.firebase.provider.FirebaseInitProvider"
android:authorities="${applicationId}.firebaseinitprovider"
android:directBootAware="true"
android:exported="false"
android:initOrder="100"/>
</application>
</manifest>
이러한 패턴은 필수 리소스 또는 라이브러리가 앱의 라이프사이클 초기에 자동으로 초기화되도록 하여, 더 깔끔하고 모듈화된 디자인을 제공합니다. ContentProvider
의 또 다른 주목할 만한 사용 사례는 Jetpack App Startup
라이브러리에 있으며, 이는 애플리케이션 시작 시 컴포넌트를 초기화하는 간단하고 효율적인 방법을 제공합니다. 내부 구현은 InitializationProvider
라는 클래스를 사용하는데, 이는 ContentProvider
를 활용하여 Initializer
인터페이스를 구현하는 모든 사전 정의된 클래스를 초기화합니다. 이는 Application.onCreate()
메서드가 호출되기 전에 초기화 로직이 처리되도록 보장합니다.
다음은 App Startup
라이브러리의 중추 역할을 하는 InitializationProvider
의 내부 구현입니다:
/**
* The ContentProvider which discovers Initializers in an application and
* initializes them before Application.onCreate().
*/
public class InitializationProvider extends ContentProvider {
@Override
public final boolean onCreate() {
Context context = getContext();
if (context != null) {
Context applicationContext = context.getApplicationContext();
if (applicationContext != null) {
// Initialize all registered Initializer classes.
AppInitializer.getInstance(context).discoverAndInitialize(getClass());
} else {
StartupLogger.w("Deferring initialization because `applicationContext` is
null.");
}
} else {
}
return true;
}
}
이 구현의 onCreate()
메서드는 AppInitializer.getInstance(context).discoverAndInitialize(getClass())
를 호출하는데, 이는 Application
라이프사이클이 시작되기 전에 등록된 모든 Initializer
구현을 자동으로 검색하고 초기화합니다. 이를 통해 앱 컴포넌트를 Application.onCreate()
메서드를 복잡하게 만들지 않고도 효율적으로 초기화할 수 있습니다.
21 October 2025