其他

Google公布I/O 2017 for Android的源代码

2017-08-28 Google 谷歌开发者


我们公布了官方 Google I/O 2017 for Android 应用的源代码:

https://github.com/google/iosched


今年的应用对现有功能做出了实质性的修改,同时增加了几项新功能。它还扩展了技术栈,以便可以利用 Firebase。在此文中,我们将重点介绍该应用的几个显著改变以及它们的设计考虑。


2017 版最突出的一项新功能是会议预订系统,该系统旨在帮助节省现场参会者的时间并提供简洁顺畅的会议体验。注册的参会者可在会前或大会期间预订会议并加入等待列表;预订可以快速进入会场,而不必排上漫长的队伍。预订数据与参会者的大会胸卡同步,这样,会议工作人员可以使用启用 NFC 的手机核实预订数据。预订功能不仅大受欢迎,预订数据也帮助会议工作人员在 I/O 会前或大会期间改变会议室大小,以适应实际的座位需求。



此预订功能是使用 Firebase Realtime Database (RTDB) 和 Cloud Functions for Firebase 来实现的。RTDB 可在不同用户设备之间轻松同步,我们只需要在代码中实现一个侦听器来接收数据库更新。RTDB 还提供开箱即用的离线支持,即使是在旅行期间网络连接断断续续时,也能获取会议数据。一个云函数在后台处理用户的预订请求,使用事务来确保状态的正确性(防止顽皮的用户预订太多座位!)并与会议胸卡系统通信。


在往届大会中,我们使用 ContentProvider 作为所有应用数据之上的抽象层,这意味着,我们必须确定如何将 RTDB 数据集成到 ContentProvider。我们需要在两个本地数据缓存方案之间权衡考虑:

1) 通过 ContentProvider 访问的现存本地 SQLite 数据库,

2) RTDB 创建的本地缓存,用于支持离线访问。我们决定将所有应用数据集成到 ContentProvider 中:一旦 RTDB 中更改了用户的预订数据,我们即会更新 ContentProvider,使之始终成为应用数据的单一可信来源。这意味着,我们需要只在 Session Detail Activity 这个屏幕中保持对 RTDB 的开放连接,在这里,用户可以主动管理他们的预订。在应用的其他部分显示的预订数据由 ContentProvider 提供支持。在离线模式下,或者如果到 RTDB 的连接断断续续或者延时严重,我们只需从 ContentProvider 获取用户预订数据的最近已知状态。


我们还必须设计出好的方案,将 RTDB 集成到整个 IOSched 同步逻辑中,尤其是由于 RTDB 提供的同步模型与我们之前在该应用中使用的先 ping 再 fetch 的方法大不相同。我们决定继续使用 Cloud Endpoints 在各个设备之间同步用户数据并与网络和 iOS 客户端同步(数据本身存储在数据存储区中)。



尽管 RTDB 提供开箱即用的数据同步功能,我们还是希望确保用户的预订数据在所有设备上都是最新的, 即使应用未在前台运行。 我们使用一个云函数将 RTDB 预订数据集成到同步流中:一旦 RTDB 中更改了用户的预订数据,该函数即会更新端点,而这会触发向所有用户设备发送一个 Firebase 云消息传递下行消息,随后即会计划数据同步。



今年的应用还提供了一个资讯流的功能,向用户每小时通报 I/O 上的进展动态(该应用的大多数用户都在远程,资讯流是他们了解大会的窗口)。资讯流也由 RTDB 驱动,通过简单的 CMS 将数据推送到服务器。我们使用一个云函数来监控 RTDB 资讯流数据,当在服务器上更新资讯流数据时,该函数将向客户端发送一个云消息传递下行消息,后者会以视觉形式通知用户存在新的资讯流项目。


在 2015 年和 2016 年,我们一直采用 MVP 架构的 IOSched,今年,我们继续使用该架构。这种架构很好地分离了关注问题,方便测试,并且总体上使我们的代码更整齐,更易于维护。对于资讯流功能,受到 Android 架构蓝图的启发(https://github.com/googlesamples/android-architecture),我们决定试验一种更轻量级的 MVP 实现方法,该方法提供必要的模块化,同时又非常容易概念化。其目标兼具教育性和实践性:我们希望为开发者示范一种备用的 MVP 模式;我们还希望展示一种适合我们对此功能的需求的架构。


IOSched 首次大量使用了 Firebase Remote Config。在过去,我们发现自己无法在大会之前或大会期间通知用户非会议数据的更改:WiFi 信息、巴士时刻表、拼车折扣代码等。强制应用更新并不可行;我们只希望更新应用内的默认值。使用远程配置可以轻松解决我们的这个问题。


最后,我们设计出一套三层系统,用于通知用户上述更改:

  • 通过云消息传递和数据同步(先 ping 再 fetch 模型)传达大会数据和用户数据更改。

  • 资讯流数据更改通过 RTDB 进行控制。

  • 对应用内常量的更改通过远程配置进行控制。


未来计划

尽管我们公布了 2017 年代码,未来几个月我们仍有工作要做。我们将要更新代码,以遵循后台处理的现代模式(并使我们的应用兼容“O”),未来,我们将采用 Android 的架构组件来简化应用的总体设计。开发者可以在 GitHub 上跟踪此代码的更改情况:

https://github.com/google/iosched


查看全文及文中链接,请点击文末“阅读原文”。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存