Foundation/Android

[Android] Hilt AndroidEntryPoint Annotation

개발왕 금골드 2022. 11. 20. 15:00
반응형

Introduce

  • Application에서 멤버 주입을 사용 가능으로 설정한 후, @AndroidEntryPoint Annotation을 사용하여 다른 Android class에서 멤버 주입을 사용 가능으로 설정할 수 있다.
  • 다음 유형에서 @AndroidEntryPoint를 사용할 수 있다.
  1. Activity
  2. Fragment
  3. View
  4. Service
  5. 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가 포함되어 있다면 마찬가지로 런타임 예외가 발생한다.
    1. 좀 더 깊게 들어가면, Hilt Fragment는 같은 Activity Instance에 detaced and reattached될 수 있다. 이 경우 Hilt Fragment는 onAttach()의 첫 호출에서만 주입된다.
    2. 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

 

Android Entry Points

Note: Examples on this page assume usage of the Gradle plugin. If you are not using the plugin, please read this page for details. Android types Once you have enabled members injection in your Application, you can start enabling members injection in your o

dagger.dev

 

반응형