gpt4 book ai didi

android - 如何在关注可重用性和关注点分离的 android 库模块之间实现导航?

转载 作者:行者123 更新时间:2023-12-05 00:04:56 25 4
gpt4 key购买 nike

我正在尝试实现一个单独的导航模块来在 android 库模块之间导航,重点是可伸缩性、可重用性和模块独立性。我的应用程序架构类似于此示例:

enter image description here

我目前的做法

1- 定义 NavigatorInterface对于每个图书馆

2- 实现每个 NavigatorInterfaceNavigationModule . (当然导航模块会知道所有其他库模块,但没关系,因为它不会被重用)

以下是我上面提到的架构的示例代码:

:auth

|-- 登录 Activity

|-- 注册 Activity

|-- 认证导航器

public class LoginActivity extends AppCompatActivity {
private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

.....
private void signup(){
navigator.NavigateToSignup(this);
}

private void profile(){
navigator.NavigateToProfile(this);
}
.....
}


public class SignupActivity extends AppCompatActivity {
private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

.....
private void login(){
navigator.NavigateToLogin(this);
}

private void profile(){
navigator.NavigateToProfile(this);
}
.....
}



public interface AuthNavigator {
void NavigateToLogin(Context context);
void NavigateToRegister(Context context);
}

:简介

|-- 个人资料 Activity

|-- 简介导航器
public class ProfileActivity extends AppCompatActivity {
private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

.....
private void about(){
navigator.NavigateToAbout(this);
}
.....
}


public interface ProfileNavigator {
void NavigateToProfile(Context context);
}

:关于

|-- 关于 Activity

|-- 关于导航
public class AboutActivity extends AppCompatActivity {
private NavigatorCoordinator navigator; // how do I achieve this injection, without using Dagger etc.

.....
private void profile(){
navigator.NavigateToProfile(this);
}
.....
}


public interface AboutNavigator {
void NavigateToAbout(Context context);
}

上述方法是尝试消除同一模块内的循环依赖 :auth以及两个模块之间 :profile & :about .下面是 :navigation 的实现.

:导航

|-- 导航器
public class Navigator implements AuthNavigator, ProfileNavigator, AboutNavigator {
@Override
public void NavigateToLogin(Context context) {
context.startActivity(new Intent(context, LoginActivity.class));
}

@Override
public void NavigateToSingup(Context context) {
context.startActivity(new Intent(context, SignupActivity.class));
}

@Override
public void NavigateToProfile(Context context) {
context.startActivity(new Intent(context, ProfileActivity.class));
}

@Override
public void NavigateToAbout(Context context) {
context.startActivity(new Intent(context, AboutActivity.class));
}
}

问题:

1- 我相信,我需要实现 NavigatorCoordinator:navigation模块,但我该怎么做呢?此实现的任何示例?

2- 如何注入(inject) NavigatorCoordinator 的依赖项在每个 Activity 类中驻留在不同的 modules不使用 Deggar 或任何其他框架?我们可以使用 Application 来完成吗?类,如果是,请举例说明?

3- 如何设置 Launcher来自任何库的 Activity ,例如: LoginActivity ?

4- 如何调用 :navigation来自 :app 的模块模块以启动特定 Activity 的方式,例如: ProfileActivity ?

5- 这是实现可重用性、可扩展性和关注点分离的良好模块间导航方法吗?

6-还有其他类似的好方法吗?任何代码示例?链接到文章?

PS:请不要告诉我使用导航架构组件。

最佳答案

实际上,您可以为此应用一些面向对象的解决方法。首先,您可以考虑在 common 模块中声明一个导航器接口(interface)。由于每个模块都是独立的并且彼此不认识,因此您需要遵循更通用的方法。您可以定义类似 Navigator 界面的东西

interface Navigator {
fun navigate(activity: Activity, bundle: Bundle)
}
现在考虑打开 Activity 而不引用它,但使用一个键。您应该有一个工厂来将给定的键映射到 Activity 导航器。你可以认为你想用一个键打开 AboutActivity,因为你没有它的引用。键可以是整数,也可以是类包名,没关系。我会坚持使用包名称作为键。
interface NavigatorFactory {
fun of(packageName: String): Navigator
}
在 Activity 中导航时,您需要以某种方式获取这些导航器。一种理想的方法是使用应用程序类,因为您在任何 Activity 中都有它的引用。所以我们定义了一个接口(interface)来应用到应用程序类。
interface NavigatorApplication {
fun getNavigatorFactory(): NavigatorFactory
}
所以我们在公共(public)模块中结束我们的实现。让我们继续应用程序模块。
您需要开始声明这些接口(interface)的实现
class AboutActivityNavigator: Navigator {
public void navigate(Activity activity, bundle: Bundle) {
val intent = Intent(activity, AboutActivity::class.java)
activity.startActivity(intent, bundle)
}
}
返回这些 Navigator 实例的工厂实现。
object NavigatorFactoryImpl: NavigatorFactory {
fun get(key: String): Navigator {
when(key) {
is "com.example.AboutActivity" -> AboutActivityNavigator()
}
}
}
为工厂提供模块已知的接口(interface)。这样模块可以到达接口(interface)并接收工厂实例。
class Application: NavigatorApplication {
val factoryImpl = NavigatorFactoryImpl()
fun getNavigatorFactory() = factoryImpl
}
我们也完成了应用程序模块。现在,您可以导航到任何模块中所需的每个 Activity 。
class ProfileActivity: Activity() {
fun navigateToAboutActivity() {
(application as? NavigatorApplication)?
.getNavigatorFactory()
.of("com.example.AboutActivity")
.navigate(this, Bundle())
}
}
最后,一切都是有代价的。您的模块是完全独立的。但不要忘记,您仍然在传递一些硬编码的 key 来打开 Activity 。此外,您无法保证类型安全。如果您在包中传递诸如 ("page-id",34) 之类的键值对,您可能永远不知道目标 Activity 是否接受相同的键和相同的类型。
而且如果以后有基于单activity的架构,也可以查看 Jetpack Navigation by Google

关于android - 如何在关注可重用性和关注点分离的 android 库模块之间实现导航?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61359745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com