我有一个Mortar应用程序,MortarActivityScope是根范围内的第一个孩子。 MortarActivityScope有一个ActivityScope,它为注入的类提供了一个活动:
@Module(addsTo = ApplicationModule.class, injects = {Foo.class, SomePresenter.class, AnotherPresenter.class})
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides Activity provideActivity() {
return activity;
}
}
public class Foo {
private final Activity activity;
@Inject(Activity activity) {
this.activity = activity;
}
public void doSomethingWithActivity() {
// do stuff with activity: findViewById(), getWindow(), mess with action bar etc.
}
}
在方向发生变化之前,这很好。在Mortar示例项目中,不会在方向更改时销毁活动范围。这可能是为了让@Singleton主持人,屏幕等能够在方向变化中持续存在。您可以在示例项目的主要活动中的onDestroy()方法中看到这一点:
@Override protected void onDestroy() {
super.onDestroy();
actionBarOwner.dropView(this);
// activityScope may be null in case isWrongInstance() returned true in onCreate()
if (isFinishing() && activityScope != null) {
MortarScope parentScope = Mortar.getScope(getApplication());
parentScope.destroyChild(activityScope);
activityScope = null;
}
}
}
但是,这样做意味着旧的ObjectGraph会在方向更改中持续存在。我观察到Mortar.requireActivityScope
没有用旧蓝图提供的新模块替换旧活动范围中的模块。相反,对象图保留对前一个模块的引用,包括销毁的Activity。
public class MyActivity extends Activity implements Blueprint {
@Inject foo;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MortarScope parentScope = Mortar.getScope(getApplication());
activityScope = Mortar.requireActivityScope(parentScope, this);
Mortar.inject(this, this);
foo.doSomethingWithActivity(); //fails, because activity injected by object graph is destroyed
}
@Override
public String getMortarScopeName() {
return getClass().getName();
}
@Override
public Object getDaggerModule() {
return new ActivityModule(this);
}
}
Mortar示例活动似乎通过在主模块中不包含@Provides Activity
方法来解决这个问题。但MortarActivityScope
是否应该能够注入活动?在不改变方向更改的所有单件对象(Presenter
对象等)的情况下,首选方法是什么?
答案 0 :(得分:5)
不要让任何人注入活动,这是不安全的。而是注入与Activity绑定的演示者。
How to handle onActivityResult() with Mortar包含拥有演示者的活动的示例。您的应用程序的其他部分,包括其他演示者,可以注入该部分,并要求它做他们需要做的任何需要处理活动的事情。
并且不需要将所有特定于活动的工作绑定到单个活动演示者中。我们的活动有几位演示者将其服务代理到应用程序的其余部分。