您正在寻找的基本上是一种关于如何与其他类进行通信的干净方法。它们是否位于不同的模块中并没有真正的区别。
以下示例描述了如何LoginActivity
可以导航到某些个人资料活动。这只是一个基本示例,需要根据您的实际需要和打算进行改进!
- 定义您的接口
编写你想要的接口need。您的登录应该能够打开个人资料页面?嗯,这听起来像是需要一个LoginNavigator
!
interface LoginNavigator {
void showProfile();
}
将这些接口包含在您的共享组件中。不定义接口实际上是不可能的。您可以使它们更抽象或更细粒度,这完全取决于您。
- 声明您的依赖项
请记住您的登录名如何需要LoginNavigator
?真正的问题是如何将其提供给你的班级。您应该看看依赖注入,因为有喜欢的框架dagger-2 /questions/tagged/dagger-2这(可以)使这变得更容易。现在,我们为公共组件定义一个接口,以便我们可以检索我们需要的依赖项。
interface NavigatorProvider {
LoginNavigator provideNavigator();
}
你可能猜到了——这个方法用于获取实际的LoginNavigator
您可以使用它来获取该接口的实现。通常您只需在构造函数中声明此依赖项,但由于 android 有点特殊,您需要自己从某个地方获取它。
- 提供您的依赖项
最简单的方法是让您的应用程序实现此接口(或持有一个实现此接口的对象)。
class MyApp extends Application implements NavigatorProvider {
LoginNavigator provideNavigator() {
return new LoginNavigator() {
void showProfile() {
// just some sample code. You should probably not use an
// anonymous class
startActivity(new Intent(this, MyProfileActivity.class));
}
};
}
}
同样,您也可以返回一个实现此接口的对象。这只是一个基本示例。
- 使用接口。 (并且不关心实现)
现在依赖注入已接近完成。我们有一个我们需要的接口,我们有一些方法来提供依赖关系,剩下的就是获取它并使用它。
class LoginActivity extends Activity {
LoginNavigator mNavigator;
void onCreate() {
// get the dependency
mNavigator = ((NavigatorProvider) getApplicationContext()).provideNavigator();
// use it where needed. (again, just sample code)
findShowProfileView().setOnClickListener(new OnClickListener() {
void onClick(View view) {
mNavigator.showProfile();
}
});
}
}
现在提供了依赖项,可以使用了。
该示例展示的是如何基本上使用接口来解耦逻辑。您仍然需要一些入口点,因为 android 不允许实现您自己的构造函数 - 这就是使用应用程序类的原因。