Android 和 Architecture 架构
Android 操作系统为构建可在广泛的设备和外形上运行良好的应用程序提供了坚实的基础。话虽如此,我们听取了开发者的反馈意见,像复杂的生命周期和缺乏推荐的应用程序架构这样的问题,使编写健壮的应用程序变得具有挑战性。
我们需要使编写强大的应用程序更轻松,更有趣,让开发人员可以专注创新的领域。今天,我们宣布推出 Android 应用程序架构指南以及架构组件的预览。而不是在重复造轮子,我们也认识到一些流行的 Android 库已经实现了这样的功能。
视频简介 链接
意见不是处方
我们知道有多种方式来编写 Android 应用程序。我们提供的一套指南可以帮助你构建 Android 应用程序,以最好的 Android 互动的独特方式创建 Android 应用程序。Android framework 具有明确的 API 来处理与操作系统的联系点,例如 Activity,但这些是你的应用程序的入口点,而不是为应用程序架构构建块;framework 组件不会强制你将数据模型与 UI 组件分开,或提供一种清晰的方式来保持与生命周期和数据分开。
构建模块
Android Architecture(架构) 组件一起来实现一个理想的应用程序架构,同时他们单独解决开发人员的痛点。这些组件的第一组可帮助你:
- 自动管理你的活动和片段生命周期,以避免内存和资源泄漏
- 将 Java 数据对象持久化到 SQLite 数据库
生命周期组件
新的生命周期感知组件提供了将应用程序的核心组件绑定到生命周期事件的结构,从而消除了显式的依赖路径。
一个典型的 Android 观察模型是在 onStart() ) 中开始观察,并停止观察 onStop() )。这听起来相当简单,但通常你会有几次异步调用同时发生,所有这些都会管理其组件的生命周期。很容易错过边缘的情况。生命周期组件可以帮助解决这个问题。
生命周期 , LifecycleOwner 和 LifecycleObserver
所有这一切的核心类是 Lifecycle 。它使用 当前生命周期状态 的枚举以及生命周期事件的枚举来跟踪其关联组件的生命周期状态。
生命周期状态和事件
LifecycleOwner 是一个从 getLifecycle() ) 方法返回 Lifecycle 对象的接口,而 LifecycleObserver 是一个可以通过向其方法添加注释来监视组件的生命周期事件的类。将这一切都集中在一起,我们可以创建生命周期感知组件,可以监视生命周期事件并查询当前的生命周期状态。
public class MyObserver implements LifecycleObserver {
public MyObserver(Lifecycle lifecycle) {
// Starts lifecycle observation
lifecycle.addObserver(this);
...
}
public void startFragmentTransaction() {
// Queries lifecycle state
if (lifecycle.getState.isAtLeast(STARTED)) {
// perform transaction
}
}
// Annotated methods called when the associated lifecycle goes through these events
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
}
}
MyObserver observer = new MyObserver(aLifecycleOwner.getLifecycle());
LiveData
LiveData 是可观察到的生命周期感知的数据 holder 类。你的 UI 代码赞同底层数据的变化,绑到 LifecycleOwner 和 LiveData 来确保观察:
- 在 Lifecycle 处于活动状态(STARTED 或 RESUMED)时获取数据更新
- 当 LifecycleOwner 被销毁时被删除
- 当 LifecycleOwner 由于配置更改而重新启动或从后面的堆栈重新启动时,获取最新的数据
这有助于消除许多内存泄漏的途径,并通过避免更新停止的活动来减少崩溃。 LiveData 被许多听众观察,每个绑在生命周期所有者,例如 Fragment 或 Activity 来观察。
视图模型
ViewModel 是一个辅助类,包含用于将视图数据和 UI 控制器逻辑分离,提供给 Activity 或 Fragment UI 数据。只要 Activity 或 Fragment 的范围是活着的,包括何时由于配置更改而销毁和重新创建 Activity 或 Fragmentis,ViewModel 就会被保留。这允许 ViewModel 使 UI 数据可用于重新创建的 Activity 或 Fragment 实例。使用 LiveData 包装存储在 ViewModel 中的 UI 数据,为数据提供了可观察的生命周期感知。LiveData 处理事件的通知方,ViewModel 来确保数据妥善保留。
数据持续性
Android 架构组件还可以使用 Room 库简化数据持久性。Room 提供了一个对象映射抽象层,允许流畅的数据库访问,同时充分利用 SQLite 的全部功能。核心框架为处理原始 SQL 内容提供内置支持。虽然这些 API 是强大的,但它们相当低级,需要大量的时间和精力才能使用:
- 没有对原始 SQL 查询的编译时验证。
- 随着结构的更改,你需要手动更新受影响的 SQL 查询。这个过程可能是耗时且容易出错的。
- 你需要编写大量样板代码以在 SQL 查询和 Java 数据对象之间进行转换。
当你在为 SQLite 抽象封装的时候,Room 为你处理这些问题。
Room 有三个主要组成部分:
- 实体 表示使用注释的 Java 数据对象构造的单个数据库行的数据。每个实体都坚持在自己的表中。
- DAO (数据访问对象)定义访问数据库的方法,使用注释将 SQL 绑定到每个方法。
- 数据库 是一个 holder 类,它使用注释来定义实体列表和数据库版本。类内容定义了 DAO 列表。它也是底层数据库连接的主要访问点。
要使用 Room,你可以注释要保留为实体的 Java 数据对象,创建一个包含这些实体的数据库,并使用 SQL 定义一个 DAO 类来访问和修改数据库。
@Entity
public class User {
@PrimaryKey
private int uid;
private String name;
// Getters and Setters - required for Room
public int getUid() { return uid; }
public String getName() { return name; }
public void setUid(int uid) { this.uid = uid; }
public void setName(String name) { this.name = name; }
}
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List getAll();
@Insert
void insertAll(User... users);
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
架构组件设计为独立的,但是当它们被并入有效的应用程序架构中时,它们是最有效的。今天我们推出了一个 应用架构指南 ,展示了如何使用架构组件构建一个强大的,模块化的和可测试的应用程序。指南有三个主要目标:
- 定义适用于 Android 应用开发的原则。
- 描述与这些原则配合使用的应用程序架构。
- 显示如何使用架构组件实现该架构。
我们建议需要处理这些问题的开发人员阅读指南。即使你对现有的应用程序架构感到满意,指南将具有有用的原则和见解。
只是开始
我们计划继续受到意见,并继续引入新的架构组件,以便 Android 开发人员在构建应用程序时做出明智的选择。我们鼓励你尝试预览,并就我们正在做的事情提供反馈意见,因为我们都在一起,使 Android 应用程序开发更加轻松,更有趣。要了解有关 Android 体系结构的更多信息,请查看:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论