아래 실무에서 Hilt EntryPoint 주입이 필요한 주요 컴포넌트별 예제를 Kotlin과 Java로 각각 제공합니다.
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun messageHelper(): MessageHelper
}
class MyWorker(
context: Context,
workerParams: WorkerParameters
) : Worker(context, workerParams) {
override fun doWork(): Result {
val entryPoint = EntryPointAccessors.fromApplication(context, MyEntryPoint::class.java)
val helper = entryPoint.messageHelper()
helper.showToast("WorkManager DI 성공!")
return Result.success()
}
}
@EntryPoint
@InstallIn(SingletonComponent.class)
public interface MyEntryPoint {
MessageHelper getMessageHelper();
}
public class MyWorker extends Worker {
public MyWorker(@NonNull Context context, @NonNull WorkerParameters params) {
super(context, params);
}
@NonNull
@Override
public Result doWork() {
MyEntryPoint entryPoint = EntryPointAccessors.fromApplication(getApplicationContext(), MyEntryPoint.class);
MessageHelper helper = entryPoint.getMessageHelper();
helper.showToast("WorkManager DI 성공!");
return Result.success();
}
}
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun messageHelper(): MessageHelper
}
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val entryPoint = EntryPointAccessors.fromApplication(context, MyEntryPoint::class.java)
entryPoint.messageHelper().showToast("BroadcastReceiver DI!")
}
}
@EntryPoint
@InstallIn(SingletonComponent.class)
public interface MyEntryPoint {
MessageHelper getMessageHelper();
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MyEntryPoint entryPoint = EntryPointAccessors.fromApplication(context, MyEntryPoint.class);
MessageHelper helper = entryPoint.getMessageHelper();
helper.showToast("BroadcastReceiver DI!");
}
}
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun messageHelper(): MessageHelper
}
class MyProvider : ContentProvider() {
override fun onCreate(): Boolean {
val entryPoint = EntryPointAccessors.fromApplication(context!!, MyEntryPoint::class.java)
entryPoint.messageHelper().showToast("ContentProvider DI!")
return true
}
// ... 기타 구현
}
@EntryPoint
@InstallIn(SingletonComponent.class)
public interface MyEntryPoint {
MessageHelper getMessageHelper();
}
public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {
MyEntryPoint entryPoint = EntryPointAccessors.fromApplication(getContext(), MyEntryPoint.class);
MessageHelper helper = entryPoint.getMessageHelper();
helper.showToast("ContentProvider DI!");
return true;
}
// ... 기타 구현
}
@EntryPoint
@InstallIn(SingletonComponent::class)
interface MyEntryPoint {
fun messageHelper(): MessageHelper
}
class AlarmReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val entryPoint = EntryPointAccessors.fromApplication(context, MyEntryPoint::class.java)
entryPoint.messageHelper().showToast("AlarmManager Broadcast DI!")
}
}
@EntryPoint
@InstallIn(SingletonComponent.class)
public interface MyEntryPoint {
MessageHelper getMessageHelper();
}
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MyEntryPoint entryPoint = EntryPointAccessors.fromApplication(context, MyEntryPoint.class);
MessageHelper helper = entryPoint.getMessageHelper();
helper.showToast("AlarmManager Broadcast DI!");
}
}
이렇게 EntryPoint를 사용하면
Hilt가 관리하지 않는 시스템 컴포넌트에서도 DI 객체를 안전하게 사용할 수 있습니다.
모든 예제에서 EntryPoint 인터페이스 필요,
컴포넌트 내부에서 EntryPointAccessors 사용하여 객체 획득하는 것이 핵심 패턴입니다.
출처