What is Dependency Injection (DI) in Android development?
Dependency Injection is a way to provide objects that a class needs (its dependencies) from outside, instead of creating them inside the class. It helps make code easier to test and maintain.
Click to reveal answer
beginner
What is Hilt in Android development?
Hilt is a library built on top of Dagger that simplifies dependency injection in Android apps. It provides standard components and annotations to reduce boilerplate code.
Click to reveal answer
beginner
What annotation do you use to tell Hilt to provide a class as a dependency?
You use the @Inject annotation on the constructor of the class you want Hilt to provide as a dependency.
Click to reveal answer
intermediate
How do you make an Android Activity ready for Hilt injection?
You add the @AndroidEntryPoint annotation to the Activity class. This tells Hilt to generate the necessary code to inject dependencies into that Activity.
Click to reveal answer
intermediate
What is a Hilt Module and why do you need it?
A Hilt Module is a class annotated with @Module and @InstallIn that tells Hilt how to provide dependencies that you cannot annotate with @Inject, like interfaces or third-party classes.
Click to reveal answer
Which annotation marks a class constructor for Hilt to provide its instances?
A@Provides
B@Module
C@Inject
D@AndroidEntryPoint
✗ Incorrect
The @Inject annotation on a constructor tells Hilt how to create instances of that class.
What annotation do you use on an Android Activity to enable Hilt injection?
A@AndroidEntryPoint
B@Inject
C@Module
D@Singleton
✗ Incorrect
The @AndroidEntryPoint annotation is used on Activities, Fragments, and other Android classes to enable Hilt injection.
If you want to provide a third-party library instance with Hilt, what should you create?
AAn @Inject constructor in the library
BAn @AndroidEntryPoint annotation
CA @Singleton annotation on the library
DA Hilt Module with @Provides functions
✗ Incorrect
You create a Hilt Module with @Provides functions to tell Hilt how to provide instances of classes you cannot modify.
What scope annotation would you use to make a dependency live as long as the application?
A@ActivityScoped
B@Singleton
C@FragmentScoped
D@Reusable
✗ Incorrect
The @Singleton annotation makes the dependency live as long as the application.
Which Hilt annotation specifies where a Module should be installed?
A@InstallIn
B@Module
C@Provides
D@EntryPoint
✗ Incorrect
The @InstallIn annotation tells Hilt which component the Module belongs to, like SingletonComponent or ActivityComponent.
Explain how Hilt simplifies dependency injection in an Android app.
Think about how Hilt manages dependencies and Android classes with simple annotations.
You got /4 concepts.
Describe the steps to inject a dependency into an Android Activity using Hilt.
Focus on annotations and how Hilt connects dependencies to Android components.
You got /4 concepts.
Practice
(1/5)
1. What is the primary purpose of using @HiltAndroidApp annotation in an Android application?
easy
A. To inject dependencies into a ViewModel
B. To mark an Activity as injectable by Hilt
C. To trigger Hilt's code generation and setup the application-level dependency container
D. To define a module that provides dependencies
Solution
Step 1: Understand the role of @HiltAndroidApp
This annotation is placed on the Application class to start Hilt's code generation and create the application-level dependency container.
Step 2: Differentiate from other annotations
@AndroidEntryPoint marks Activities or Fragments, @Module defines providers, and @Inject is for injection points, so they do not setup the application container.
Final Answer:
To trigger Hilt's code generation and setup the application-level dependency container -> Option C
Quick Check:
@HiltAndroidApp = Setup app container [OK]
Hint: Remember: @HiltAndroidApp is only on Application class [OK]
Common Mistakes:
Confusing @HiltAndroidApp with @AndroidEntryPoint
Thinking @HiltAndroidApp is for Activities
Using @HiltAndroidApp on modules
2. Which of the following is the correct way to inject a dependency into an Android Activity using Hilt?
easy
A. Annotate the Activity with @AndroidEntryPoint and use @Inject lateinit var for the dependency
B. Use @Module annotation on the Activity and call inject() manually
C. Add @HiltAndroidApp on the Activity and initialize dependencies in onCreate()
D. Declare dependencies as constructor parameters without annotations
Solution
Step 1: Identify how to enable injection in Activity
Using @AndroidEntryPoint on the Activity allows Hilt to generate necessary code for injection.
Step 2: Inject dependencies inside Activity
Use @Inject lateinit var to declare dependencies that Hilt will provide automatically.
Final Answer:
Annotate the Activity with @AndroidEntryPoint and use @Inject lateinit var for the dependency -> Option A
Quick Check:
@AndroidEntryPoint + @Inject lateinit var = Activity injection [OK]
Hint: Use @AndroidEntryPoint on Activity and @Inject lateinit var inside [OK]
Common Mistakes:
Trying to use @Module on Activity
Forgetting @AndroidEntryPoint annotation
Injecting dependencies via constructor in Activity
3. Given the following Hilt module code, what will be the output when repository.getData() is called?
@Module
@InstallIn(SingletonComponent::class)
object DataModule {
@Provides
fun provideData(): String = "Hello Hilt"
}
class Repository @Inject constructor(private val data: String) {
fun getData() = data
}
medium
A. "DataModule"
B. Compilation error due to missing @Inject on Repository
C. NullPointerException at runtime
D. "Hello Hilt"
Solution
Step 1: Understand the provided dependency
The module provides a String "Hello Hilt" via the provideData() function.
Step 2: Check Repository injection
Repository constructor is annotated with @Inject and receives the String dependency correctly.
Final Answer:
"Hello Hilt" -> Option D
Quick Check:
Provided String = "Hello Hilt" [OK]
Hint: Look for @Provides return value matching injected type [OK]
Common Mistakes:
Assuming @Inject missing on Repository causes error (it is present)
Confusing module name with provided value
Expecting runtime null error without reason
4. Identify the error in the following Hilt setup:
@Module
@InstallIn(ActivityComponent::class)
object NetworkModule {
@Provides
fun provideRetrofit(): Retrofit {
return Retrofit.Builder().baseUrl("https://api.example.com").build()
}
}
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var retrofit: Retrofit
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
medium
A. Retrofit cannot be provided in ActivityComponent scope because it should be Singleton
B. Missing @Inject constructor in Retrofit class
C. MainActivity must be annotated with @HiltAndroidApp
D. Retrofit instance must be created manually, not with @Provides
Solution
Step 1: Check the component scope for Retrofit
Retrofit is usually a singleton because it is expensive to create and shared across app.
Step 2: Analyze the module's @InstallIn scope
The module is installed in ActivityComponent, which creates a new instance per Activity, not singleton.
Step 3: Identify the mismatch
Providing Retrofit in ActivityComponent scope causes multiple instances, which is incorrect for Retrofit.
Final Answer:
Retrofit cannot be provided in ActivityComponent scope because it should be Singleton -> Option A
Quick Check:
Retrofit = Singleton scope needed [OK]
Hint: Provide expensive objects in SingletonComponent scope [OK]
Common Mistakes:
Thinking Retrofit needs @Inject constructor
Confusing @HiltAndroidApp with @AndroidEntryPoint
Believing manual creation is required with @Provides
5. You want to inject two different implementations of an interface Logger using Hilt in your Android app. Which approach correctly distinguishes these implementations for injection?
hard
A. Provide both implementations in the same module without qualifiers and inject List<Logger>
B. Use @Qualifier annotations with different names on each provider and injection site
C. Use @Singleton on both implementations and inject Logger directly
D. Create separate modules for each implementation without any annotations
When multiple implementations of the same interface exist, Hilt needs a way to distinguish them.
Step 2: Use @Qualifier annotations
Custom @Qualifier annotations with different names allow Hilt to know which implementation to inject where.
Step 3: Reject other options
Injecting List<Logger> is possible but does not distinguish single injection points; @Singleton does not differentiate implementations; separate modules without qualifiers cause ambiguity.
Final Answer:
Use @Qualifier annotations with different names on each provider and injection site -> Option B
Quick Check:
Multiple implementations = use @Qualifier [OK]
Hint: Use @Qualifier to name different implementations [OK]
Common Mistakes:
Injecting interface without qualifiers causes errors