Now in Android !AndroidApp开发的最佳实践,让我看看是怎么个事?

6,927 阅读5分钟

在Android的官网,有个示例程序,在官网是这样介绍它的。 developer.android.google.cn/samples?hl=… github github.com/android/now…

image.png

image.png

那我得看看了。

1、功能介绍

b6c54b23e2b6404a73d5b9117e58cf3.jpg 4dddbcc975e28d7a35552f77dd4f35e.jpg ab3fadfc2aeaaece09f044cad1be4f9.jpg

1.1 ForYou 首页

头部是一个标题栏,是一个公用的组件。

中间是一个列表,Item的内容就是Android届的文章和新闻。有图片,标题和描述。标题右边有一个收藏按钮。Item的下边是分类标签,这个文章属于哪一类,哪一个标签。 下边是一个TabBar。 在首页第一次进入的时候,列表时没有数据的,会显示另外一个界面,让你选择你感兴趣的标签。是一个横向的GridView列表。有兴趣的同学可以去github上看看,学一学。

1f82a3c8a6a729d179eae75172066e3.jpg

1.2 Saved

这个就是你收藏过的列表,这里边全是你收藏的文章。 列表结构和首页一致。

1.3 Interests

第三个页面就是,选择你感兴趣的标签和分类。选中状态是对钩,首页的数据,根据你选中的标签,去请求数据。

1.4 标题栏

两个功能,一个是搜索,一个是设置主要用来设置主题,和黑暗模式,还有动态颜色

89874b6c93e62cb1273d6436a4e0058.jpg 5a4d950d00667d3502272336f528d14.jpg

整体的功能就这些。 该说不说这小App设计的还不赖,感觉看起来还是很舒服的。相比我们公司的很妙的UI设计, 参考这篇文章,,,老板,你怎么用Compose画了个墓碑.... 感觉还是这个看起来比较舒服。

2、技术架构

2.1 模块化

这个项目已经完全模块化,分了很多模块

image.png

image.png 在Now in AndroidDiagram中显示模块的类型和它们在Now in AndroidDiagram中的依赖关系。提示:模块图(如上所示)可以在模块化规划中用于可视化模块之间的依赖关系。 app模块——包含应用级和脚手架类,它们绑定了其余的代码库,比如MainActivity、NiaApp和applevel控制的导航。 一个很好的例子是通过NiaNavHost的导航设置和通过TopLevelDestination的底部导航栏设置。app模块依赖于所有的功能模块和所需的核心模块。 feature: modules——特定于功能的模块,它们的作用域是处理应用程序中的单个职责。这些模块可以被任何应用程序重用,包括测试或其他风味的应用程序,在需要的时候,同时仍然保持分离和隔离。 如果一个类只被一个特性模块需要,它应该留在那个模块中。 如果没有,则应将其提取到适当的核心模块中。 一个特性模块不应该依赖于其他特性模块。 它们只依赖于所需的核心模块。 core: modules——包含辅助代码和特定依赖的公共库模块,它们需要在应用中的其他模块之间共享。这些模块可以依赖于其他核心模块,但它们不应该依赖于功能模块或应用模块。 其他模块-例如同步,基准测试和测试模块,以及app-nia-catalog-一个目录应用程序,用于快速显示我们的设计系统。

这模块还是分的很全的,值得大家学习的,东西还是挺多的。看起来比较高级。

2.2 架构

Now in Android ,遵循官方架构指导。
架构有三层 UI DoMain Data

image.png 官方的Android架构不同于其他架构,比如“Clean architecture”。 来自其他体系结构的概念可能不适用于这里,或者以不同的方式应用。

该体系结构遵循具有单向数据流的响应式编程模型。
数据层位于底层,关键概念是:高层对低层的变化作出反应。
事件向下流动。
数据向上流动。

image.png

在ForYou界面上显示新闻 当应用程序第一次运行时,它将尝试从远程服务器加载新闻资源列表。(当选择prod构建风格时,演示苟江将使用本地数据库)一旦加载,将根据用户选择的兴趣,显示给用户,下图显示了发生的事件,以及数据如何从相关对象中流出来实现这一目标。

image.png 下面是每一步发生的情况,你们可以把源码加载到AndroidStudio中,根据步骤去跟一下。

StepDescriptionCode
1在应用启动时 将 WorkManager 的所有任务,将被同步执行Sync.initialize
2ForYouViewModel 调用 GetUserNewsResourcesUseCase 来获取带有书签,保存状态的新闻列表数据 在用户和新闻存储库都发出一个条目之前,不会有条目被发出到这个流中,在等待期间,feed的状态设置成 Loading.Search for usages of NewsFeedUiState.Loading
3用户数据仓库从由 Proto DataStore 支持的本地数据源获取一个 UserData 对象流NiaPreferencesDataSource.userData
4WorkManager 执行同步任务,该任务调用 OfflineFirstNewsRepository 开始与远程数据源同步数据SyncWorker.doWork
5OfflineFirstNewsRepository 调用 RetrofitNiaNetwork 使用 Retrofit 执行实际的 API 请求。OfflineFirstNewsRepository.syncWith
6RetrofitNiaNetwork 调用远程服务器上的 REST API。 RetrofitNiaNetwork.getNewsResourcesRetrofitNiaNetwork.getNewsResources
7RetrofitNiaNetwork 从远程服务器接收网络响应。RetrofitNiaNetwork.getNewsResources
8OfflineFirstNewsRepository 通过在本地 Room 数据库中插入、更新或删除数据,将远程数据与 NewsResourceDao 同步。OfflineFirstNewsRepository.syncWith
9当 NewsResourceDao 中的数据发生变化时,它会被发出到新闻资源数据流(这是一个 Flow)。.NewsResourceDao.getNewsResources
10OfflineFirstNewsRepository 作为此流上的中间操作符,将传入的 PopulatedNewsResource(数据库模型,内部用于数据层)转换为公共 NewsResource 模型,供其他层消费。OfflineFirstNewsRepository.getNewsResources
11GetUserNewsResourcesUseCase 将新闻资源列表与用户数据结合,发出一个 UserNewsResources 列表.GetUserNewsResourcesUseCase.invoke
12当 ForYouViewModel 接收到可保存的新闻资源时,它会将 feed 状态更新为成功。 ForYouScreen 然后使用状态中的可保存新闻资源渲染屏幕。Search for instances of NewsFeedUiState.Success

大体的架构就是这样,更详细的架构介绍 github.com/android/now…

3、总结

这个App用到了Flow流,Room,Retrofit,Compose,还有Hilt(听说是KPI产品)模块化,协程,是个不错的App,我觉得有点麻烦,所以说我需要学习的东西还是有很多的,这个App的具体学习,以后会出单门的文章去学习。这篇先给大家介绍一下!