Android 操作系统为构建可在广泛的设备和外形上运行良好的应用程序提供了坚实的基础。话虽如此,我们听取了开发者的反馈意见,像复杂的生命周期和缺乏推荐的应用程序架构这样的问题,使编写健壮的应用程序变得具有挑战性。
我们需要使编写强大的应用程序更轻松,更有趣,让开发人员可以专注创新的领域。今天,我们宣布推出 Android 应用程序架构指南以及架构组件的预览。而不是在重复造轮子,我们也认识到一些流行的 Android 库已经实现了这样的功能。
视频简介 链接
我们知道有多种方式来编写 Android 应用程序。我们提供的一套指南可以帮助你构建 Android 应用程序,以最好的 Android 互动的独特方式创建 Android 应用程序。Android framework 具有明确的 API 来处理与操作系统的联系点,例如 Activity,但这些是你的应用程序的入口点,而不是为应用程序架构构建块;framework 组件不会强制你将数据模型与 UI 组件分开,或提供一种清晰的方式来保持与生命周期和数据分开。
Android Architecture(架构) 组件一起来实现一个理想的应用程序架构,同时他们单独解决开发人员的痛点。这些组件的第一组可帮助你:
新的生命周期感知组件提供了将应用程序的核心组件绑定到生命周期事件的结构,从而消除了显式的依赖路径。
一个典型的 Android 观察模型是在 onStart() ) 中开始观察,并停止观察 onStop() )。这听起来相当简单,但通常你会有几次异步调用同时发生,所有这些都会管理其组件的生命周期。很容易错过边缘的情况。生命周期组件可以帮助解决这个问题。
所有这一切的核心类是 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 是可观察到的生命周期感知的数据 holder 类。你的 UI 代码赞同底层数据的变化,绑到 LifecycleOwner 和 LiveData 来确保观察:
这有助于消除许多内存泄漏的途径,并通过避免更新停止的活动来减少崩溃。 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 是强大的,但它们相当低级,需要大量的时间和精力才能使用:
当你在为 SQLite 抽象封装的时候,Room 为你处理这些问题。
Room 有三个主要组成部分:
要使用 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 体系结构的更多信息,请查看: