AAC (Android Architecture Components) — набор компонентов для построения устойчивой архитектуры Android-приложений
AAC — это библиотеки от Google, которые помогают разрабатывать гибкие, тестируемые и поддерживаемые приложения, решая ключевые проблемы:
- Утечки памяти (например, поворот экрана).
- Сложность управления жизненным циклом.
- Сохранение данных при изменениях конфигурации.
🔥 Основные компоненты AAC
1. ViewModel
Хранит и управляет UI-данными, переживая изменения конфигурации (например, поворот экрана).
Пример:
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> get() = _data
fun loadData() {
_data.value = "Hello from ViewModel!"
}
}
// В Activity/Fragment:
val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
viewModel.data.observe(this) { value ->
textView.text = value
}
2. LiveData
Observable-холдер данных, который учитывает жизненный цикл (автоматически отписывается при onDestroy
).
Особенности:
- Нет утечек памяти (привязан к жизненному циклу).
- Автоматическое обновление UI (только при активном состоянии).
3. Room
Библиотека для работы с SQLite, превращающая БД в Kotlin/Java-объекты.
Пример:
@Entity
data class User(@PrimaryKey val id: Int, val name: String)
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): LiveData<List<User>>
}
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
// Использование:
val db = Room.databaseBuilder(context, AppDatabase::class.java, "app-db").build()
db.userDao().getAll().observe(this) { users ->
// Обновление UI
}
4. DataBinding
Связывает UI-элементы напрямую с данными (уменьшает boilerplate-код).
Пример:
<layout>
<data>
<variable name="user" type="com.example.User"/>
</data>
<TextView
android:text="@{user.name}" />
</layout>
5. Navigation
Управление навигацией между фрагментами (замена FragmentManager
).
Пример:
<navigation>
<fragment
android:id="@+id/fragmentA"
app:destination="@id/fragmentB" />
</navigation>
6. WorkManager
Фоновые задачи, которые выполняются даже после перезапуска приложения.
Пример:
val uploadWork = OneTimeWorkRequestBuilder<UploadWorker>().build()
WorkManager.getInstance(context).enqueue(uploadWork)
⚡ Почему AAC?
✅ Стандарт от Google (интеграция с Jetpack).
✅ Избегание утечек памяти.
✅ Упрощение тестирования (ViewModel и LiveData легко тестируются).
✅ Сохранение данных при повороте экрана.
🛠 Пример архитектуры с AAC (MVVM)
// Model (Room Entity)
@Entity
data class Note(@PrimaryKey val id: Int, val text: String)
// Repository
class NoteRepository(private val dao: NoteDao) {
fun getNotes(): LiveData<List<Note>> = dao.getAll()
}
// ViewModel
class NotesViewModel(repository: NoteRepository) : ViewModel() {
val notes = repository.getNotes()
}
// View (Activity/Fragment)
val viewModel: NotesViewModel by viewModels()
viewModel.notes.observe(this) { notes ->
adapter.submitList(notes)
}
📊 Сравнение AAC с другими подходами
Критерий | AAC (MVVM) | MVP | MVC (устарел) |
---|---|---|---|
Связность | Низкая (LiveData) | Средняя | Высокая |
Тестируемость | Высокая | Высокая | Низкая |
Жизненный цикл | Автоматический | Ручной | Ручной |
🚀 Как начать?
- Добавьте зависимости в
build.gradle
:
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.0"
implementation "androidx.room:room-ktx:2.5.0"
- Используйте шаблон «MVVM с AAC» в новом проекте Android Studio.
💡 Советы
✔ Не храните контекст в ViewModel (используйте AndroidViewModel
если нужно).
✔ Комбинируйте LiveData с корутинами (liveData { emit(data) }
).
✔ Используйте SavedStateHandle
для сохранения состояния при убийстве процесса.
🔥 Вывод
AAC — это стандартный способ построения современных Android-приложений, который:
✔ Упрощает работу с данными и жизненным циклом.
✔ Предотвращает утечки памяти.
✔ Подходит для MVVM и Clean Architecture.
Что изучать дальше?
- Hilt (DI для AAC).
- Kotlin Flow (альтернатива LiveData).
- Compose (декларативный UI + AAC).