# Android Essence

Recent content on Android Essence

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## About

DevFeed: [About](<https://devfeed.tech/articles/about-22788.md>)

Original publisher: [Read original article](<http://androidessence.com/about/>)

Published: 2026-09-15T02:35:35.573025Z

Content type: article

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Development](<https://devfeed.tech/topics/development.md>), [Android](<https://devfeed.tech/topics/android.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [android-development](<https://devfeed.tech/tags/android-development.md>), [community](<https://devfeed.tech/tags/community.md>), [development](<https://devfeed.tech/tags/development.md>), [github](<https://devfeed.tech/tags/github.md>), [navigation-drawer](<https://devfeed.tech/tags/navigation-drawer.md>), [programming](<https://devfeed.tech/tags/programming.md>), [recyclerview](<https://devfeed.tech/tags/recyclerview.md>)

### AI overview

Android Essence is an introductory Android development resource focused on making programming concepts understandable to learners of all skill levels. It emphasizes core programming fundamentals and accepts requests for additional topics through GitHub issues.

### Source excerpt

About Android Essence Android Essence was first launched on September 2, 2015 by Adam McNeilly. It started off with Adam just wanting to share everything he'd learned about Android development with the community. You can find all sorts of historical context from these posts, like understanding a RecyclerView vs ListView, or even working with a navigation drawer (what a throwback). The problem is that there wasn't always a rhyme or reason to the posts.

## An Android Developer's Journey from Learning to Build Apps to Practicing the Craft

DevFeed: [An Android Developer's Journey from Learning to Build Apps to Practicing the Craft](<https://devfeed.tech/articles/leave-me-behind-22819.md>)

Original publisher: [Read original article](<http://androidessence.com/leave-me-behind/>)

Author: Adam McNeilly

Published: 2026-05-17T00:00:00Z

Content type: opinion

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Java](<https://devfeed.tech/topics/java.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [AdventureX 2026](<https://devfeed.tech/topics/adventurex2026.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [app](<https://devfeed.tech/tags/app.md>), [hackathons](<https://devfeed.tech/tags/hackathons.md>), [java](<https://devfeed.tech/tags/java.md>), [learning](<https://devfeed.tech/tags/learning.md>), [programming](<https://devfeed.tech/tags/programming.md>)

### AI overview

The author reflects on learning Android development, beginning with a todo list app and later developing and maintaining applications with practical benefits. The article emphasizes learning from courses, practicing by building, and connecting with other software engineers through hackathons.

### Source excerpt

"If you don't learn how to use AI, you're going to be left behind." So leave me behind. I learned to build Android applications in 2014. I was in college taking a Java programming class, when a classmate shared a free online course to learn Android development. The goal was short: build a todo list app with local storage. When I completed the minimum requirements, I unplugged my phone from my laptop and went over to my parents to show them what I built. I often refer to this as my "lightbulb moment". Here in my hands was a real, tangible piece of software that I built and could interact with. It wasn't the first time I programmed something, but it was the first time I had an application on a device that I could carry over and show someone. The app lived in my pocket, always available when I needed it, to help me stay organized and productive.

## Managing Multi Table Inserts With Room

DevFeed: [Managing Multi Table Inserts With Room](<https://devfeed.tech/articles/managing-multi-table-inserts-with-room-22825.md>)

Original publisher: [Read original article](<http://androidessence.com/multi-table-inserts/>)

Author: Adam McNeilly

Published: 2026-04-25T00:00:00Z

Content type: article

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Database](<https://devfeed.tech/topics/database.md>), [Object-oriented programming (OOP)](<https://devfeed.tech/topics/oop.md>), [Polymorphism](<https://devfeed.tech/topics/polymorphism.md>), [interfaces](<https://devfeed.tech/topics/interfaces.md>), [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [database](<https://devfeed.tech/tags/database.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [inheritance](<https://devfeed.tech/tags/inheritance.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>), [oop](<https://devfeed.tech/tags/oop.md>)

### AI overview

This article explains how to handle multi-table inserts in Room when entities have nested dependencies. It first considers separate DAO interfaces and a wrapper class, then shows how interface inheritance can centralize insertion logic and let dependent DAOs reuse it.

### Source excerpt

A properly relational database may have a type that appears referenced multiple times. In my SpaceNerd playground app, that is the Country object. An Agency has a country, and an Agency is a dependency of a Launch, of a Space Station, and likely more types to come. How do I enforce that any time I insert an Agency, I also insert the Countries associated with it? That's what this blog post sets out to explore, and the answer is much simpler than I thought when I started.

## Reflecting On A Decade Of Content Creation

DevFeed: [Reflecting On A Decade Of Content Creation](<https://devfeed.tech/articles/reflecting-on-a-decade-of-content-creation-22831.md>)

Original publisher: [Read original article](<http://androidessence.com/reflecting-on-a-decade/>)

Author: Adam McNeilly

Published: 2025-09-02T00:00:00Z

Content type: opinion

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Twitch](<https://devfeed.tech/topics/twitch.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [blog-post](<https://devfeed.tech/tags/blog-post.md>), [community](<https://devfeed.tech/tags/community.md>), [content-creation](<https://devfeed.tech/tags/content-creation.md>), [writing](<https://devfeed.tech/tags/writing.md>)

### AI overview

The author reflects on ten years of publishing content through AndroidEssence and other developer platforms. The article describes learning Android through shared community resources and a continuing goal of making Android content accessible to developers at all skill levels.

### Source excerpt

Ten years ago today, I published my first blog post. There's something special about looking back an entire decade at an achievement like that. A chance to reflect on what my life was like then, the motivations that got me into writing, and where I am today as a result. It has been an honor to learn in public over these last ten years, whether that be here on AndroidEssence, on Twitch, on YouTube, at Droidcon, or the countless number of meetups, hackathons, and other events that have enabled me to connect with the amazing Android community.

## Sharing Shared Element Keys

DevFeed: [Sharing Shared Element Keys](<https://devfeed.tech/articles/sharing-shared-element-keys-22835.md>)

Original publisher: [Read original article](<http://androidessence.com/sharing-shared-element-keys/>)

Author: Adam McNeilly

Published: 2025-08-24T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [compose](<https://devfeed.tech/tags/compose.md>), [model](<https://devfeed.tech/tags/model.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to keep shared element keys consistent across Compose screens by defining them on UI-specific DisplayModels. The approach centralizes animation-related keys and separates domain data from UI representation, while also supporting testability.

### Source excerpt

Shared Element Transitions are a fantastic way to add visual flair to your applications. They allow us to animate content between two separate screens. One complication is sharing keys for these components across different screens in a consistent manner. Let's explore one simple option.

## Wrapping Android XR For KMP

DevFeed: [Wrapping Android XR For KMP](<https://devfeed.tech/articles/wrapping-android-xr-for-kmp-22789.md>)

Original publisher: [Read original article](<http://androidessence.com/android-xr-kmp/>)

Author: Adam McNeilly

Published: 2024-12-19T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android XR](<https://devfeed.tech/topics/android-xr.md>), [compose-multiplatform](<https://devfeed.tech/topics/compose-multiplatform.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [cross-platform](<https://devfeed.tech/topics/cross-platform.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>)

Tags: [android-xr](<https://devfeed.tech/tags/android-xr.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [cross-platform](<https://devfeed.tech/tags/cross-platform.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kmp](<https://devfeed.tech/tags/kmp.md>)

### AI overview

A tutorial showing how to wrap Android XR functionality for Kotlin Multiplatform projects. It defines shared XR behavior, provides an Android-specific implementation, uses expect/actual declarations for platform differences, and exposes the session through Jetpack Compose CompositionLocals.

### Source excerpt

Recently I've been finding myself immersed in Compose Multiplatform, a way to build cross platform mobile applications with Jetpack Compose UI. Of course, when Android announced their extended reality framework Android XR this week, I initially worried I wouldn't be able to try it out in my newest side projects. However, one of the biggest benefits of KMP is how seamless it is to provide platform specific functionality for your shared code. So let's do that with Android XR.

## Interface Naming Conventions

DevFeed: [Interface Naming Conventions](<https://devfeed.tech/articles/interface-naming-conventions-22818.md>)

Original publisher: [Read original article](<http://androidessence.com/interface-naming-conventions/>)

Author: Adam McNeilly

Published: 2023-02-05T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [interfaces](<https://devfeed.tech/topics/interfaces.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [code](<https://devfeed.tech/tags/code.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [interface](<https://devfeed.tech/tags/interface.md>), [interfaces](<https://devfeed.tech/tags/interfaces.md>)

### AI overview

This article discusses naming conventions for interfaces and their implementations. It explains limitations of traditional naming patterns and presents alternatives based on data sources, situations, and responsibilities.

### Source excerpt

Many engineers will tell you that one of the most complicated responsibilities of our job is naming things. Variables, classes, functions, everything we write requires conscious thought. A special case among these are interfaces. This is because we not only have to name an interface, but we need to decide how to name the implementations as well.

## Understanding Dependency Injection in Android Through Constructor Injection

DevFeed: [Understanding Dependency Injection in Android Through Constructor Injection](<https://devfeed.tech/articles/the-imposter-s-guide-to-dependency-injection-22842.md>)

Original publisher: [Read original article](<http://androidessence.com/the-imposter-guide-to-dependency-injection/>)

Author: Adam McNeilly

Published: 2022-01-31T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>), [Development](<https://devfeed.tech/topics/development.md>), [Android](<https://devfeed.tech/topics/android.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Firebase](<https://devfeed.tech/topics/firebase.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [firebase](<https://devfeed.tech/tags/firebase.md>), [guide](<https://devfeed.tech/tags/guide.md>), [unit-test](<https://devfeed.tech/tags/unit-test.md>)

### AI overview

This tutorial explains dependency injection in Android, beginning with tightly coupled Firebase Analytics code and its testing difficulties. It introduces constructor injection as a way to supply dependencies and use a fake implementation in tests.

### Source excerpt

Dependency Injection is one of the hottest topics in Android and software development in general. It's also a topic that can provide a lot of anxiety and create imposter syndrome for developers. In this post, we'll take incremental steps toward understanding DI, why we need it, and how to implement it inside our applications.

## Five Essential Developer Experience Concepts For Android

DevFeed: [Five Essential Developer Experience Concepts For Android](<https://devfeed.tech/articles/five-essential-developer-experience-concepts-for-android-22806.md>)

Original publisher: [Read original article](<http://androidessence.com/essential-dev-experience-concepts-android/>)

Author: Adam McNeilly

Published: 2021-09-10T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Developer experience](<https://devfeed.tech/topics/developer-experience.md>), [GitHub Actions](<https://devfeed.tech/topics/github-actions.md>), [Android](<https://devfeed.tech/topics/android.md>), [ci](<https://devfeed.tech/topics/ci.md>), [GitHub](<https://devfeed.tech/topics/github.md>), [Pull Request](<https://devfeed.tech/topics/pull-request.md>), [Tooling](<https://devfeed.tech/topics/tooling.md>), [YAML](<https://devfeed.tech/topics/yaml.md>), [Jenkins](<https://devfeed.tech/topics/jenkins.md>), [Ruby](<https://devfeed.tech/topics/ruby.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [ci](<https://devfeed.tech/tags/ci.md>), [developer](<https://devfeed.tech/tags/developer.md>), [developer-experience](<https://devfeed.tech/tags/developer-experience.md>), [env-file-security](<https://devfeed.tech/tags/env-file-security.md>), [github](<https://devfeed.tech/tags/github.md>), [github-actions](<https://devfeed.tech/tags/github-actions.md>), [jenkins](<https://devfeed.tech/tags/jenkins.md>), [pull-request](<https://devfeed.tech/tags/pull-request.md>), [ruby](<https://devfeed.tech/tags/ruby.md>), [yaml](<https://devfeed.tech/tags/yaml.md>)

### AI overview

This tutorial presents five developer experience concepts for an Android project: GitHub Actions, Danger, Ktlint, Detekt, and Git hooks. It explains how these tools can automate workflows, enforce code quality, and streamline pull request checks.

### Source excerpt

In the most recent live stream for Tasks Of Affirmation, we looked at creating a good developer experience. It's important to consider developers at the start of any new project, so we can ensure that over the lifetime of a project anyone who contributes can understand how to contribute, match any guidelines that a team has, and get up and running quickly. We also want to ensure that our codebase maintains a certain quality of formatting and a lack of code smells - and putting these checks in place before you even start prevents them from ever being introduced at all. Let's look at five developer experience concepts I consider essential to every project.

## Tasks Of Affirmation: A New Twitch Live Stream Series

DevFeed: [Tasks Of Affirmation: A New Twitch Live Stream Series](<https://devfeed.tech/articles/tasks-of-affirmation-a-new-twitch-live-stream-series-22843.md>)

Original publisher: [Read original article](<http://androidessence.com/toa-twitch-series/>)

Author: Adam McNeilly

Published: 2021-09-02T00:00:00Z

Content type: article

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [To-Do](<https://devfeed.tech/topics/todo.md>), [Twitch](<https://devfeed.tech/topics/twitch.md>), [Streaming](<https://devfeed.tech/topics/streaming.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [GitHub Issues](<https://devfeed.tech/topics/github-issues.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [github](<https://devfeed.tech/tags/github.md>), [github-issues](<https://devfeed.tech/tags/github-issues.md>), [streaming](<https://devfeed.tech/tags/streaming.md>), [twitch](<https://devfeed.tech/tags/twitch.md>)

### AI overview

The author announces a new Twitch live-stream series, Tasks Of Affirmation, focused on building a more supportive and compassionate to-do list application. The streams will document Android development in real time, including learning, debugging, and project organization with GitHub Projects and GitHub Issues.

### Source excerpt

In the late summer of 2020, I began live streaming on my Twitch channel. We started off by building an Android Study Guide application. The purpose of the application was to build something people would be interested in using, while also taking the opportunity to build an application out in the open. For a number of reasons, discussed in the latest video, I've decided to sunset that project and begin a new live stream series: Tasks Of Affirmation.

## Unit Testing Custom Lint Checks

DevFeed: [Unit Testing Custom Lint Checks](<https://devfeed.tech/articles/unit-testing-custom-lint-checks-22847.md>)

Original publisher: [Read original article](<http://androidessence.com/unit-testing-custom-lint-checks/>)

Author: Adam McNeilly

Published: 2021-03-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Testing](<https://devfeed.tech/topics/testing.md>), [Unit testing](<https://devfeed.tech/topics/unit-testing.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [testing](<https://devfeed.tech/tags/testing.md>), [unit-testing](<https://devfeed.tech/tags/unit-testing.md>)

### AI overview

A tutorial on unit testing custom Android lint checks. It explains the required dependencies, test setup, mock XML or Java/Kotlin inputs, optional configuration, task execution, and assertions for successful lint results.

### Source excerpt

In our previous post we looked at writing a custom lint check to enforce usages of a custom view instead of an Android framework implementation. In this post, we'll go over how to unit test such a scenario, and take the opportunity to look at some additional options of unit testing with lint as well.

## Enforcing Custom View Usage With Android Lint

DevFeed: [Enforcing Custom View Usage With Android Lint](<https://devfeed.tech/articles/enforcing-custom-view-usage-with-android-lint-22805.md>)

Original publisher: [Read original article](<http://androidessence.com/enforce-custom-views-with-lint/>)

Author: Adam McNeilly

Published: 2021-02-22T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [components](<https://devfeed.tech/tags/components.md>), [customization](<https://devfeed.tech/tags/customization.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [lint](<https://devfeed.tech/tags/lint.md>)

### AI overview

This tutorial explains how to write a custom Android lint check that enforces the use of project-specific custom views instead of corresponding Android framework views in layout XML files.

### Source excerpt

Sometimes an Android project will have to implement a custom view that is an extension of an existing Android view. We may do this for style purposes, or to implement additional logic, or any number of customization purposes. This solution brings a new problem for our codebase - how do we enforce that other developers use our custom view, instead of the Android framework view? We can solve this problem by writing our own Android lint check.

## Storing Network Responses With Apollo Normalized Cache

DevFeed: [Storing Network Responses With Apollo Normalized Cache](<https://devfeed.tech/articles/storing-network-responses-with-apollo-normalized-cache-22839.md>)

Original publisher: [Read original article](<http://androidessence.com/storing-network-responses-with-apollo-normalized-cache/>)

Author: Adam McNeilly

Published: 2021-02-05T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Caching](<https://devfeed.tech/topics/caching.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Database](<https://devfeed.tech/topics/database.md>), [media3](<https://devfeed.tech/topics/media3.md>), [Persistence](<https://devfeed.tech/topics/persistence.md>), [Code](<https://devfeed.tech/topics/code.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [debug](<https://devfeed.tech/topics/debug.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [cache](<https://devfeed.tech/tags/cache.md>), [code](<https://devfeed.tech/tags/code.md>), [configuration](<https://devfeed.tech/tags/configuration.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [http](<https://devfeed.tech/tags/http.md>), [library](<https://devfeed.tech/tags/library.md>), [network](<https://devfeed.tech/tags/network.md>), [persistence](<https://devfeed.tech/tags/persistence.md>), [sqlite](<https://devfeed.tech/tags/sqlite.md>)

### AI overview

A tutorial on Apollo Android's normalized cache for storing network response data by ID. It explains in-memory and SQLite-backed caches, cache chaining, persistence across application sessions, and cache management and debugging.

### Source excerpt

In our previous post we looked at the HTTP cache from Apollo Android for storing network responses. In this post, we look at its counter part, the normalized cache.

## Storing Network Responses With Apollo HTTP Cache

DevFeed: [Storing Network Responses With Apollo HTTP Cache](<https://devfeed.tech/articles/storing-network-responses-with-apollo-http-cache-22838.md>)

Original publisher: [Read original article](<http://androidessence.com/storing-network-responses-with-apollo-http-cache/>)

Author: Adam McNeilly

Published: 2021-02-01T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Caching](<https://devfeed.tech/topics/caching.md>), [Android](<https://devfeed.tech/topics/android.md>), [SDKs](<https://devfeed.tech/topics/sdks.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [cache](<https://devfeed.tech/tags/cache.md>), [caching](<https://devfeed.tech/tags/caching.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [http](<https://devfeed.tech/tags/http.md>), [network](<https://devfeed.tech/tags/network.md>), [sdk](<https://devfeed.tech/tags/sdk.md>)

### AI overview

A tutorial on using HTTP caching with the Apollo Android SDK. It explains how cached GraphQL responses are stored and retrieved, how to configure cache policies, and how to expire or invalidate cached data.

### Source excerpt

Caching is the practice of storing data that we requested previously so we can serve it faster in the future. This creates a better user experience by decreasing loading times. It also has long term benefits like reducing the number of network requests, to save on phone resources or potentially provide offline support. Today, we're going to discuss how to use the HTTP cache for the Apollo Android SDK.

## Comparing Three Dependency Injection Solutions

DevFeed: [Comparing Three Dependency Injection Solutions](<https://devfeed.tech/articles/comparing-three-dependency-injection-solutions-22797.md>)

Original publisher: [Read original article](<http://androidessence.com/comparing-three-dependency-injection-solutions/>)

Author: Adam McNeilly

Published: 2020-08-22T00:00:00Z

Content type: comparison

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Dependency injection](<https://devfeed.tech/topics/dependency-injection.md>), [Android](<https://devfeed.tech/topics/android.md>), [Dagger](<https://devfeed.tech/topics/dagger.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [dagger](<https://devfeed.tech/tags/dagger.md>), [dagger-hilt](<https://devfeed.tech/tags/dagger-hilt.md>), [dependency-injection](<https://devfeed.tech/tags/dependency-injection.md>), [koin](<https://devfeed.tech/tags/koin.md>), [unit-tests](<https://devfeed.tech/tags/unit-tests.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

This comparison examines three approaches to dependency injection on Android: a do-it-yourself approach, Koin, and Dagger Hilt. It explains constructor and field injection, separation of concerns, and testability, then introduces the additional concerns addressed by dependency injection libraries.

### Source excerpt

During a recent live stream on my Twitch channel, we explored three different solutions to dependency injection on Android. A do it yourself approach, Koin, and Dagger Hilt. Let's revisit them side by side, and look at the nuances between them, so we can determine which solution we want to use in our own applications.

## Mastering Room Database Migrations

DevFeed: [Mastering Room Database Migrations](<https://devfeed.tech/articles/mastering-room-database-migrations-22822.md>)

Original publisher: [Read original article](<http://androidessence.com/mastering-room-database-migrations/>)

Author: Adam McNeilly

Published: 2020-05-14T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Database Migration](<https://devfeed.tech/topics/database-migration.md>), [Database](<https://devfeed.tech/topics/database.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [app](<https://devfeed.tech/tags/app.md>), [database](<https://devfeed.tech/tags/database.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [migrations](<https://devfeed.tech/tags/migrations.md>), [schema](<https://devfeed.tech/tags/schema.md>)

### AI overview

A tutorial on migrating Room databases as an Android application changes database versions. It explains schema mismatch errors, version increments, migration failures, and destructive migrations, with attention to preserving data for offline applications.

### Source excerpt

In the last post, we demonstrated the different types of database relationships in Room. Next, we're going to explore another niched concept of Room database management: database migrations. A migration is a way to handle moving from one version of a database to another as users update your application from the play store.

## Room Relationship Recap

DevFeed: [Room Relationship Recap](<https://devfeed.tech/articles/room-relationship-recap-22834.md>)

Original publisher: [Read original article](<http://androidessence.com/room-relationship-recap/>)

Author: Adam McNeilly

Published: 2020-04-27T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Database](<https://devfeed.tech/topics/database.md>), [SQLite](<https://devfeed.tech/topics/sqlite.md>), [Library](<https://devfeed.tech/topics/library.md>), [Persistence](<https://devfeed.tech/topics/persistence.md>), [Android](<https://devfeed.tech/topics/android.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [database](<https://devfeed.tech/tags/database.md>), [go](<https://devfeed.tech/tags/go.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [library](<https://devfeed.tech/tags/library.md>), [persistence](<https://devfeed.tech/tags/persistence.md>)

### AI overview

A tutorial on organizing complex application data and modeling database relationships with the Room Persistence Library and SQLite. It explains how primitive fields map to SQLite columns, why complex properties require different approaches, and how embedded properties work along with their limitation of duplicating shared data across rows.

### Source excerpt

In this post, we're going to explore some advanced concepts of the Room Persistence Library. Room is a great tool for storing complex data for your Android applications inside a SQLite database. As you begin to store more data in your applications though, it can be difficult to determine how to organize all of it. We're going to demistify database organization, and break down everything you need to know about database relationships in the Room library.

## Getting Started With Test Driven Development

DevFeed: [Getting Started With Test Driven Development](<https://devfeed.tech/articles/getting-started-with-test-driven-development-22841.md>)

Original publisher: [Read original article](<http://androidessence.com/test-driven-development/>)

Author: Adam McNeilly

Published: 2020-03-02T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Test-driven development](<https://devfeed.tech/topics/tdd.md>), [LineageOS](<https://devfeed.tech/topics/lineageos.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [development](<https://devfeed.tech/tags/development.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [tdd](<https://devfeed.tech/tags/tdd.md>), [testing](<https://devfeed.tech/tags/testing.md>), [tests](<https://devfeed.tech/tags/tests.md>)

### AI overview

This tutorial explains Test Driven Development (TDD), in which developers write tests before implementing the code. It describes how tests clarify expected behavior, support confident development and refactoring, and discusses why adopting TDD can be difficult in Android projects.

### Source excerpt

One of the many buzzwords thrown around the software devleopment community is Test Driven Development, or TDD. It is one of those phrases that sounds great when you say it - who wouldn't want to have tests be their first priority when writing code? However, it's not always clear what TDD means. Does it mean you write code with testability in mind? Does it mean writing tests first? How can we write tests if we don't have code to test? This post will answer all of those questions, and teach you how to implement TDD effectively on Android.

## Contributing Code Samples To Kotlin Documentation

DevFeed: [Contributing Code Samples To Kotlin Documentation](<https://devfeed.tech/articles/contributing-code-samples-to-kotlin-documentation-22798.md>)

Original publisher: [Read original article](<http://androidessence.com/contributing-to-kotlin/>)

Author: Adam McNeilly

Published: 2020-02-24T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Documentation](<https://devfeed.tech/topics/documentation.md>), [Open Source](<https://devfeed.tech/topics/open-source.md>), [issue tracker](<https://devfeed.tech/topics/issue-tracker.md>), [GitHub](<https://devfeed.tech/topics/github.md>)

Tags: [beginner](<https://devfeed.tech/tags/beginner.md>), [contribute](<https://devfeed.tech/tags/contribute.md>), [documentation](<https://devfeed.tech/tags/documentation.md>), [github](<https://devfeed.tech/tags/github.md>), [issue-tracker](<https://devfeed.tech/tags/issue-tracker.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [library](<https://devfeed.tech/tags/library.md>), [open-source](<https://devfeed.tech/tags/open-source.md>)

### AI overview

A beginner-friendly tutorial explains how to contribute code samples to Kotlin's standard library documentation. It covers finding suitable tasks in YouTrack, reviewing contribution guidelines, forking and building the repository, locating functions without samples, and beginning a Vetoable example.

### Source excerpt

The Kotlin language used by Android developers all over the world is open source and available on GitHub. This means it's open for contributions from anyone! It may, of course, feel very intimidating to contribute to a project of that size. Especially for those of us who are new to open source contributions. The JetBrains team makes this process a lot less scary than it sounds. There are some beginner friendly ways to contribute to the language, and this post will walk you through every step.

## Choosing an Architecture Pattern for Android Applications

DevFeed: [Choosing an Architecture Pattern for Android Applications](<https://devfeed.tech/articles/mvwtf-demystifying-architecture-patterns-22826.md>)

Original publisher: [Read original article](<http://androidessence.com/mvwtf/>)

Author: Adam McNeilly

Published: 2019-08-16T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [mvc](<https://devfeed.tech/topics/mvc.md>), [App](<https://devfeed.tech/topics/app.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [architecture-pattern](<https://devfeed.tech/tags/architecture-pattern.md>), [mvc](<https://devfeed.tech/tags/mvc.md>), [mvi](<https://devfeed.tech/tags/mvi.md>), [mvvm](<https://devfeed.tech/tags/mvvm.md>), [patterns](<https://devfeed.tech/tags/patterns.md>)

### AI overview

This tutorial explains why Android applications need architecture patterns and compares approaches including MVC, MVP, MVVM, MVI, and MVU. It emphasizes separating application code into distinct components rather than placing all code in an Activity.

### Source excerpt

As an Android developer, one of the questions I constantly see asked within the community is "what architecture pattern should I use?" This discussion usually leads to a handful of buzzwordy acronyms: MVC MVP MVVM MVI MVU?? (We don't talk about this but apparently it's the new kid on the block) This can be really intimidating to new Android devs, as well as seasoned veterans who are constantly questioning if they're using the right one. Whether you're trying to decide which one to learn, or wondering if the one you already use is best for you, this post will help lead you to the right decision.

## Repository Pattern: Properly Organizing Your Data Layer

DevFeed: [Repository Pattern: Properly Organizing Your Data Layer](<https://devfeed.tech/articles/repository-pattern-properly-organizing-your-data-layer-22832.md>)

Original publisher: [Read original article](<http://androidessence.com/repository-pattern/>)

Author: Adam McNeilly

Published: 2019-05-20T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [App](<https://devfeed.tech/topics/app.md>), [Code](<https://devfeed.tech/topics/code.md>), [Programming](<https://devfeed.tech/topics/programming.md>), [API](<https://devfeed.tech/topics/api.md>), [GraphQL](<https://devfeed.tech/topics/graphql.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [code](<https://devfeed.tech/tags/code.md>), [developers](<https://devfeed.tech/tags/developers.md>), [graphql](<https://devfeed.tech/tags/graphql.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [programming](<https://devfeed.tech/tags/programming.md>), [retrofit](<https://devfeed.tech/tags/retrofit.md>), [viewmodel](<https://devfeed.tech/tags/viewmodel.md>)

### AI overview

This tutorial explains the Repository Pattern for organizing an application's data layer. It shows how separating data access from a ViewModel or Presenter can keep those classes focused on requesting data while allowing the underlying source to change, such as between a Retrofit service, GraphQL API, or local database.

### Source excerpt

How to properly architect your application is a concern we as developers constantly face. There's unfortunately no one size fits all answer to it, and sometimes we don't even know where to begin. I've learned along my Android journey that the answer can also vary depending on what portion of your app you're trying to organize. Of course, you might say, it depends. When it comes to your data layer, though, there are some really good tips on how to write clean, maintainable code. One of them is the Repository Pattern, and I'd like to provide a quick walk through of what it is and why it's important.

## Unit Testing RxJava Or Coroutine Code With Constructor Injection

DevFeed: [Unit Testing RxJava Or Coroutine Code With Constructor Injection](<https://devfeed.tech/articles/unit-testing-rxjava-or-coroutine-code-with-constructor-injection-22846.md>)

Original publisher: [Read original article](<http://androidessence.com/unit-testing-async-code/>)

Author: Adam McNeilly

Published: 2019-04-30T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Unit testing](<https://devfeed.tech/topics/unit-testing.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Coroutines](<https://devfeed.tech/topics/coroutines.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [apis](<https://devfeed.tech/tags/apis.md>), [constructor](<https://devfeed.tech/tags/constructor.md>), [coroutine](<https://devfeed.tech/tags/coroutine.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [rxjava](<https://devfeed.tech/tags/rxjava.md>), [testing](<https://devfeed.tech/tags/testing.md>), [unit-testing](<https://devfeed.tech/tags/unit-testing.md>)

### AI overview

This tutorial explains how to unit test asynchronous Android code written with RxJava or Kotlin coroutines. It recommends injecting schedulers or dispatchers through constructors so tests can replace them with immediate, test-friendly implementations and avoid unavailable Android main-thread or looper behavior.

### Source excerpt

Putting aside the long lasting debate right now about whether you should use RxJava or coroutines for your asynchronous code on Android, both camps often hit the same problem. How do I write unit tests for this? Unit testing asynchronous code is tricky, because we may need to know how to properly test callback APIs, or perhaps we just want things to run instantly and not worry about thread changes. We may also be wondering how to handle not having a "main" thread in a junit test, unlike a connected test. This post will be focusing on handling that last one.

## Showing A Fragment For A Result

DevFeed: [Showing A Fragment For A Result](<https://devfeed.tech/articles/showing-a-fragment-for-a-result-22837.md>)

Original publisher: [Read original article](<http://androidessence.com/starting-fragment-for-result/>)

Author: Adam McNeilly

Published: 2019-01-04T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Android](<https://devfeed.tech/topics/android.md>), [Code](<https://devfeed.tech/topics/code.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [callback](<https://devfeed.tech/tags/callback.md>), [code](<https://devfeed.tech/tags/code.md>), [fragments](<https://devfeed.tech/tags/fragments.md>), [request](<https://devfeed.tech/tags/request.md>)

### AI overview

This tutorial explains how to return a result between Android fragments using a target fragment. It demonstrates a small two-fragment application in which a name is entered in one fragment and displayed in the previous fragment.

### Source excerpt

A number of developers preach a single activity architecture on Android, which is something I've been trying to move forward to as well. In the process, though, I ran into one tricky problem. I don't have something like startActivityResult for fragments. If you're unfamiliar, startActivityForResult is a method that allows you to launch an activity with a specific request code, and when that activity finishes, your first activity will get a callback in onActivityResult and can do stuff with it. This post is going to walk through how we can achieve that same affect using fragments.

## Building An Application With MVVM

DevFeed: [Building An Application With MVVM](<https://devfeed.tech/articles/building-an-application-with-mvvm-22796.md>)

Original publisher: [Read original article](<http://androidessence.com/building-an-app-with-mvvm/>)

Author: Adam McNeilly

Published: 2018-10-28T00:00:00Z

Content type: tutorial

Language: en

Sources: [Android Essence](<https://devfeed.tech/sources/android-essence.md>)

Topics: [Development](<https://devfeed.tech/topics/development.md>), [LineageOS](<https://devfeed.tech/topics/lineageos.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [App](<https://devfeed.tech/topics/app.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-architecture](<https://devfeed.tech/tags/android-architecture.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [architecture-pattern](<https://devfeed.tech/tags/architecture-pattern.md>), [building](<https://devfeed.tech/tags/building.md>), [patterns](<https://devfeed.tech/tags/patterns.md>)

### AI overview

This tutorial introduces the MVVM architecture pattern for Android application development. It explains the roles of the Model, View, and ViewModel components, including how the ViewModel maintains state, interacts with the data source, and handles relevant business logic. It also compares MVVM's communication flow with MVP.

### Source excerpt

This is the second post in what will be an ongoing series to demonstrate a few different architecture patterns that are used for Android development. You can find the code for each of them, often appearing before the blog posts, by following this repo. Give it a star! In our previous post we discussed the MVP architecture for building an app. This time, we're going to check out MVVM.

[Next page](<https://devfeed.tech/sources/android-essence.md?cursor=WyIyMDE4LTEwLTI4VDAwOjAwOjAwKzAwOjAwIiwgImY5OThmMDk5LTVjM2MtNGZkNy1hOTZkLTBiNWQ2MWZlOTVkNSJd>)