gpt4 book ai didi

android - 设计模块化应用程序 - 导航中的循环依赖问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:56:17 27 4
gpt4 key购买 nike

如您所知,将 Android 应用程序设计为模块是当今 Android 开发领域的流行做法之一。但这种趋势带来了一些挑战。其中之一是循环依赖。

例如,我有一个导航模块,它从主页功能模块打开 HomeActivity。此外,我必须从产品模块打开另一个 Activity ,例如 ProductListActivity。

主页功能必须包含导航模块,如果我在如下 Activity 之间导航,导航模块应包含 HomeFeature:

val intent = Intent(activity, HomeActivity::class.java)

这会导致循环依赖问题。

解决此问题的最快方法是创建如下所示的 Intent 并以此方法构建导航系统。

Intent(Intent.ACTION_VIEW).setClassName(PACKAGE_NAME, className)

所以我的问题是,使用这种导航方法我们还会遇到哪些其他可能的问题?是否有其他做法来处理模块化 android 应用程序中的导航?

最佳答案

这是我的解决方案。这允许使用显式 Intent 。您还可以使用 navigation component 将此方法应用于单个 Activity 应用程序稍作修改。

这是模块 B 的导航对象

object ModuleBNavigator {

internal lateinit var navigationImpl: ModuleBContract

fun setNavigationImpl(navigationImpl: ModuleBContract) {
this.navigationImpl = navigationImpl
}

interface ModuleBContract {
fun navigateModuleA(self: Activity, bundle: Bundle?)
}
}

这是模块 B Activity

class ModuleBActivity : Activity() {

companion object {
private const val BUNDLE = "BUNDLE"
fun newIntent(context: Context, bundle: Bundle?) = Intent(context, ModuleBActivity::class.java).apply {
putExtra(BUNDLE, bundle)
}
}
}

这里是应用程序模块类,用于将导航实现注入(inject)模块 A 导航对象

class ApplicationModuleApp : Application() {

// Can also inject with a DI library
override fun onCreate() {
super.onCreate()
ModuleBNavigator.setNavigationImpl(object : ModuleBNavigator.ModuleBContract {
override fun navigateModuleA(self: Activity, bundle: Bundle?) {
self.startActivity(ModuleBActivity.newIntent(self, bundle))
}
})
}
}

最后,您可以使用提供的实现从模块 A -> 模块 B 导航

class ModuleAActivity : Activity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ... Some code
ModuleBNavigator.navigationImpl.navigateModuleA(this, Bundle())
// .. Some code
}
}

此方法避免了循环依赖,您不必再使用隐式 Intent 。希望这会有所帮助。

关于android - 设计模块化应用程序 - 导航中的循环依赖问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54037244/

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