Reputation: 24433
I used @subcomponent
mostly for case activities need to use some shared objects from application component, or fragments components want to use some objects provided by container activity.
Now I am wondering if I can make some activity components be subcomponent
of another activity component. For example, the TaskDetailActivity
has a task object and want to provide to some other activities such as TaskParticipantActivity
, TaskProgressActivity
and some fragments.
The traditional way to provide task object to other activities is set it into intent
object, but how about if we want to use Dagger2 for this case?
Update: my sistuation similar with the case of UserScope in this article http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/, but instead of saving the user component in Application class, can I save in an activity, i.e TaskDetailActivity
?
Upvotes: 0
Views: 996
Reputation: 21487
Components are for grouping objects of a similar lifecycle. While Components may happen to correspond to a particular set of functionality (like a TaskComponent
for injecting a TaskActivity
and a TaskPresenter
) it is not always possible or desirable to insist on only one Component per set of functionality (for instance, insisting on only one TaskComponent
for all task related activities and dependencies).
Instead, in Dagger 2 re-usability is available through Modules which you can very easily swap in and out of Components. Within the constraints of the advice for organising your Modules for testability in the Dagger 2 official documentation you are able to organise Modules congruent with your functionality (e.g., a TaskModule
for all-task related dependencies). Then, because Components are so lightweight, you can make as many as you like to deal with the different lifecycles of your Activities and so on. Remember also that you can compose Modules using the Class<?> [] includes()
method inside the Module
@interface
.
In your particular scenario, you want to share the Task
object from a TaskDetailActivity
. If you held a reference to the Task
within your TaskDetailActivity
then that reference will no longer be available when TaskDetailActivity
is destroyed. While you could try some solution of holding binding the Task
in a Module and then maintaining a reference to that Module at the app-scope level, you would essentially be doing the same as the UserScope
at the app-scoped level in the article you have linked. Any kind of solution for sharing the Task
object between Activity using Dagger 2 would necessarily involve maintaining a reference to the object at the app-scoped level.
Using Dagger 2 doesn't mean that the new
keyword or serialization/deserialization of Parcelables
is now wrong and so if your first intuition is to use Intent
to communicate then I would say that you are right. If you need a more robust solution than directly communicating the Task
, then you could extract a TaskRepository
and transmit an Intent
between Activity that contains the id
of the Task
you wish to retrieve. Indeed, some of the Google Android Architecture Blueprints have a solution just like this.
Upvotes: 3