Foundation/Android
[Android] Hilt AndroidEntryPoint Annotation
개발왕 금골드
2022. 11. 20. 15:00
반응형
Introduce
- Application에서 멤버 주입을 사용 가능으로 설정한 후, @AndroidEntryPoint Annotation을 사용하여 다른 Android class에서 멤버 주입을 사용 가능으로 설정할 수 있다.
- 다음 유형에서 @AndroidEntryPoint를 사용할 수 있다.
- Activity
- Fragment
- View
- Service
- BroadcastReceiver
@AndroidEntryPoint
class MyActivity : MyBaseActivity() {
// Bindings in SingletonComponent or ActivityComponent
@Inject lateinit var bar: Bar
override fun onCreate(savedInstanceState: Bundle?) {
// Injection happens in super.onCreate().
super.onCreate()
// Do something with bar ...
}
}
Retained Fragments
- Fragment의 onCreate 메서드에서 setRetainInstance(true)를 호출하면 Fragment의 Instance를 삭제하고 다시 만드는 대신 Configuration Changes 상황에서 Fragment Instance를 유지한다.
- Hilt Fragment는 Components(주입을 담당)에 대한 참조를 갖고 있으며, 이 Components는 Activity Instance에 대한 참조 또한 갖고 있기 때문에 Configuration Change상황에서 유지되지 않아야 한다.
- 이러한 이유는 Hilt Fragment가 유지될 경우 Fragment에 주입되는 범위 Binding 및 Provider도 메모리 누수를 일으킬 수 있다.
- 결론적으로, Hilt Fragment가 유지되지 않도록 유지된 Hilt Fragment가 감지되면 Configuration Change 상황 시 런타임 예외가 발생한다. Hilt가 아닌 Fragment더라도 하위 Component에 Hilt가 포함되어 있다면 마찬가지로 런타임 예외가 발생한다.
- 좀 더 깊게 들어가면, Hilt Fragment는 같은 Activity Instance에 detaced and reattached될 수 있다. 이 경우 Hilt Fragment는 onAttach()의 첫 호출에서만 주입된다.
- retained Fragment는 Activity의 다른 Instance에 다시 reattached되기 때문에 Fragment를 retaining하는 것과 다르다.
Views with Fragment bindings
- 기본적으로, SingletonComponent 및 ActivityComponent 바인딩만 View에 주입할 수 있다.
- View에서 Fragment Binding을 사용하려면 @WithFragmentBindings Annotation을 추가한다.
@AndroidEntryPoint
@WithFragmentBindings
class MyView : MyBaseView {
// Bindings in SingletonComponent, ActivityComponent,
// FragmentComponent, and ViewComponent
@Inject lateinit var bar: Bar
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
init {
// Do something with bar ...
}
override fun onFinishInflate() {
super.onFinishInflate();
// Find & assign child views from the inflated hierarchy.
}
}
참고자료 :
https://dagger.dev/hilt/android-entry-point.html
반응형