5

我有一个 Mortar 应用程序,其中 MortarActivityScope 作为根范围下的第一个子项。MortarActivityScope 有一个 ActivityScope,它 @Provides 为注入的类提供一个活动:

@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 示例项目中,Activity 范围不会在方向更改时被破坏。这大概是为了允许@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);
    }
}

@Provides ActivityMortar 示例活动似乎通过在主模块中不包含方法来解决此问题。但是不MortarActivityScope应该能够注入活动吗?这样做的首选方法是什么,而不会Presenter在方向更改时丢失所有单例对象(对象等)?

4

1 回答 1

5

不允许任何人注入活动,这不能保证安全。而是注入一个与 Activity 绑定的演示者。

如何使用 Mortar 处理 onActivityResult()包括一个拥有演示者的 Activity 的示例。然后,您的应用程序的其他部分(包括其他演示者)可以注入该部分并要求它执行他们需要完成的任何需要处理活动的事情。

并且无需将所有特定于活动的工作绑定到单个活动演示者中。我们的活动有几个演示者将其服务代理到应用程序的其余部分。

于 2014-10-23T22:55:30.877 回答