Руководства по приложениям android

Привет, Хабр! Представляю вашему вниманию вольный перевод «Руководство по архитектуре приложения (Guide to app architecture)» из JetPack. Все замечания по переводу прошу оставлять в комментариях, и они будут исправлены. Так же для всех будут полезны комментарии от тех кто использовал представленную архитектуру с рекомендациями её использования.

Это руководство охватывает лучшие практики и рекомендуемую архитектуру для создания надежных приложений. Эта страница предполагает базовое знакомство с Android Framework. Если вы новичок в разработке приложений для Android, ознакомьтесь с нашими руководствами для разработчиков, чтобы начать работу и узнать больше о концепциях, упомянутых в этом руководстве. Если вы интересуетесь архитектурой приложений и хотели бы ознакомиться с материалами этого руководства с точки зрения программирования на Kotlin, ознакомьтесь с курсом Udacity «Разработка приложений для Android с помощью Kotlin».

Опыт пользователя мобильного приложения

В большинстве случаев настольные приложения имеют единую точку входа с рабочего стола или программы запуска, а затем запускаются как единый монолитный процесс. Приложения на Android имеют гораздо более сложную структуру. Типичное приложение для Android содержит несколько компонентов приложения, включая Activities, Fragments, Services, ContentProviders и BroadcastReceivers.

Вы объявляете все или некоторые из этих компонентов приложения в манифесте приложения. Затем ОС Android использует этот файл, чтобы решить, как интегрировать ваше приложение в общий пользовательский интерфейс устройства. Учитывая, что правильно написанное приложение Android содержит несколько компонентов, и пользователи часто взаимодействуют с несколькими приложениями за короткий промежуток времени, приложения должны адаптироваться к различным типам рабочих процессов и задач, управляемых пользователями.

Например, рассмотрим, что происходит, когда вы делитесь фотографией в своем любимом приложении для социальных сетей:

  1. Приложение вызывает намерение (Intent) камеры. Android запускает приложение камеры для обработки запроса. На данный момент пользователь покинул приложение для социальных сетей, и его опыт как пользователя безупречен.
  2. Приложение камеры может вызывать другие намерения, например запуск средства выбора файлов, которое может запустить еще одно приложение.
  3. В конце концов, пользователь возвращается в приложение социальной сети и делится фотографией.

В любой момент процесса пользователь может быть прерван телефонным звонком или уведомлением. После действия, связанного с этим прерыванием, пользователь ожидает, что сможет вернуться и возобновить этот процесс обмена фотографиями. Такое поведение переключения приложений распространено на мобильных устройствах, поэтому ваше приложение должно правильно обрабатывать эти моменты (задачи).

Помните, что мобильные устройства также ограничены в ресурсах, поэтому в любой момент операционная система может уничтожить некоторые процессы приложения, чтобы освободить место для новых.

Учитывая условия этой среды, компоненты вашего приложения могут запускаться по отдельности и не по порядку, а операционная система или пользователь могут уничтожить их в любое время. Поскольку эти события не находятся под вашим контролем, вы не должны хранить какие-либо данные или состояния в ваших компонентах приложения, и ваши компоненты приложения не должны зависеть друг от друга.

Общие архитектурные принципы

Если вы не должны использовать компоненты приложения для хранения данных и состояния приложения, как вы должны разрабатывать свое приложение?

Разделение ответственности

Самый важный принцип, которому нужно следовать, — это разделение ответственности. Распространена ошибка, когда вы пишете весь свой код в Activity или Fragment. Это классы пользовательского интерфейса которые должны содержать только логику обрабатывающую взаимодействие пользовательского интерфейса и операционной системы. Как можно больше разделяя ответственность в этих классах (SRP), вы можете избежать многих проблем, связанных с жизненным циклом приложения.

Управление пользовательским интерфейсом из модели

Другой важный принцип заключается в том, что вы должны управлять своим пользовательским интерфейсом из модели, предпочтительнее из постоянной модели. Модели — это компоненты, которые отвечают за обработку данных для приложения. Они не зависят от объектов View и компонентов приложения, поэтому на них не влияют жизненный цикл приложения и связанные с ним проблемы.

Постоянная модель идеально подходит по следующим причинам:

  • Ваши пользователи не потеряют данные, если ОС Android уничтожит ваше приложение, чтобы освободить ресурсы.
  • Ваше приложение продолжает работать в тех случаях, когда сетевое соединение нестабильно или недоступно.

Организовывая основу вашего приложение на модельных классах с четко определенной ответственностью по управлению данными, ваше приложение становится более тестируемым и поддерживаемым.

Рекомендуемая архитектура приложения

Этот раздел демонстрирует как структурировать приложение, используя компоненты архитектуры, работая в сквозном сценарии использования.

Примечание. Невозможно иметь один способ написания приложений, который лучше всего подходит для каждого сценария. При этом рекомендованная архитектура является хорошей отправной точкой для большинства ситуаций и рабочих процессов. Если у вас уже есть хороший способ написания приложений для Android, соответствующий общим архитектурным принципам, менять его не стоит.

Представьте, что мы создаем пользовательский интерфейс, который показывает профиль пользователя. Мы используем приватный API и REST API для извлечения данных профиля.

Обзор

Для начала рассмотрим схему взаимодействия модулей архитектуры готового приложения:

Обратите внимание, что каждый компонент зависит только от компонента на один уровень ниже его. Например, Activity и Fragments зависят только от модели представления. Repository является единственным классом, который зависит от множества других классов; в этом примере хранилище зависит от постоянной модели данных и удаленного внутреннего источника данных.

Этот дизайн паттерн создает последовательный и приятный пользовательский опыт. Независимо от того, вернется пользователь к приложению через несколько минут после его закрытия или спустя несколько дней, он мгновенно увидит информацию пользователя о том, что приложение сохраняется локально. Если эти данные устарели, модуль хранилища приложения начинает обновлять данные в фоновом режиме.

Создаём пользовательский интерфейс

Пользовательский интерфейс состоит из фрагмента UserProfileFragment и соответствующего ему файла макета user_profile_layout.xml.

Для управления пользовательским интерфейсом наша модель данных должна содержать следующие элементы данных:

  • User ID: идентификатор пользователя. Лучшим решением является передача этой информации во фрагмент, используя аргументы фрагмента. Если ОС Android разрушает наш процесс, эта информация сохраняется, поэтому идентификатор будет доступен при следующем запуске нашего приложения.
  • User object: класс данных, который содержит сведения о пользователе.

Мы используем UserProfileViewModel, основанный на компоненте архитектуры ViewModel, чтобы сохранить эту информацию.

Объект ViewModel предоставляет данные для определенного компонента пользовательского интерфейса, таких как fragment или Activity, и содержит бизнес-логику обработки данных для взаимодействия с моделью. Например, ViewModel может вызывать другие компоненты для загрузки данных и может пересылать запросы пользователей на изменение данных. ViewModel не знает о компонентах пользовательского интерфейса, поэтому на него не влияют изменения конфигурации, такие как воссоздание Activity при повороте устройства.

Теперь мы определили следующие файлы:

  • user_profile.xml: определили макет пользовательского интерфейса.
  • UserProfileFragment: описали контроллер пользовательского интерфейса, который отвечает за отображение информации пользователю.
  • UserProfileViewModel: класс отвечающий за приготовление данных для отображения их в UserProfileFragment и реагирует на взаимодействие с пользователем.

В следующих фрагментах кода показано начальное содержимое этих файлов. (Файл макета опущен для простоты.)

class UserProfileViewModel : ViewModel() {
   val userId : String = TODO()
   val user : User = TODO()
}

class UserProfileFragment : Fragment() {
   private val viewModel: UserProfileViewModel by viewModels()

   override fun onCreateView(
       inflater: LayoutInflater, container: ViewGroup?,
       savedInstanceState: Bundle?
   ): View {
       return inflater.inflate(R.layout.main_fragment, container, false)
   }
}

Теперь, когда у нас есть эти модули кода, как мы их соединяем? После того как пользовательское поле установлено в классе UserProfileViewModel, нам нужен способ информировать пользовательский интерфейс.

Примечание. SavedStateHandle позволяет ViewModel получить доступ к сохраненному состоянию и аргументам связанного фрагмента или действия.

// UserProfileViewModel
class UserProfileViewModel(
   savedStateHandle: SavedStateHandle
) : ViewModel() {
   val userId : String = savedStateHandle["uid"] ?:
          throw IllegalArgumentException("missing user id")
   val user : User = TODO()
}

// UserProfileFragment
private val viewModel: UserProfileViewModel by viewModels(
   factoryProducer = { SavedStateVMFactory(this) }
   ...
)

Теперь нам нужно сообщить нашему Фрагменту, когда получен пользовательский объект. Вот тут-то и появляется компонент архитектуры LiveData.

LiveData — это наблюдаемый держатель данных. Другие компоненты в вашем приложении могут отслеживать изменения объектов, используя этот держатель, не создавая явных и жестких путей зависимости между ними. Компонент LiveData также учитывает состояние жизненного цикла компонентов вашего приложения, таких как Activities, Fragments и Services, и включает логику очистки для предотвращения утечки объектов и чрезмерного потребления памяти.

Примечание. Если вы уже используете такие библиотеки, как RxJava или Agera, вы можете продолжать использовать их вместо LiveData. Однако при использовании библиотек и подобных подходов убедитесь, что вы правильно обрабатываете жизненный цикл своего приложения. В частности, убедитесь, что вы приостановили свои потоки данных, когда связанный LifecycleOwner остановлен, и уничтожили эти потоки, когда связанный LifecycleOwner был уничтожен. Вы также можете добавить артефакт android.arch.lifecycle: реактивные потоки, чтобы использовать LiveData с другой библиотекой реактивных потоков, такой как RxJava2.

Чтобы включить компонент LiveData в наше приложение, мы меняем тип поля в UserProfileViewModel на LiveData . Теперь UserProfileFragment информируется об обновлении данных. Кроме того, поскольку это поле LiveData поддерживает жизненный цикл, оно автоматически очищает ссылки, когда они больше не нужны.

class UserProfileViewModel(
   savedStateHandle: SavedStateHandle
) : ViewModel() {
   val userId : String = savedStateHandle["uid"] ?:
          throw IllegalArgumentException("missing user id")
   val user : LiveData<User> = TODO()
}

Теперь модифицируем UserProfileFragment для наблюдения за данными во ViewModel и для обновления пользовательского интерфейса в соответствии с изменениями:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
   super.onViewCreated(view, savedInstanceState)
   viewModel.user.observe(viewLifecycleOwner) {
       // обновляем UI
   }
}

Каждый раз, когда данные профиля пользователя обновляются, вызывается обратный вызов onChanged(), и пользовательский интерфейс обновляется.

Если вы знакомы с другими библиотеками, в которых используются наблюдаемые обратные вызовы, возможно, вы поняли, что мы не переопределили метод onStop() фрагмента, чтобы прекратить наблюдать за данными. Этот шаг не является обязательным для LiveData, поскольку он поддерживает жизненный цикл, это означает, что он не вызовет обратный вызов onChanged(), если фрагмент находится в неактивном состоянии; то есть он получил вызовonStart(), но еще не получил onStop()). LiveData также автоматически удаляет наблюдателя при вызове метода onDestroy() у фрагмента.

Мы не добавили никакой логики для обработки изменений конфигурации, таких как поворот экрана устройства пользователем. UserProfileViewModel автоматически восстанавливается при изменении конфигурации, поэтому, как только создается новый фрагмент, он получает тот же экземпляр ViewModel, и обратный вызов вызывается немедленно с использованием текущих данных. Учитывая, что объекты ViewModel предназначены для того, чтобы пережить соответствующие объекты View, которые они обновляют, вы не должны включать прямые ссылки на объекты View в вашу реализацию ViewModel. Для получения дополнительной информации о сроке службы ViewModel соответствует жизненному циклу компонентов пользовательского интерфейса, см. Жизненный цикл ViewModel.

Получение данных

Теперь, когда мы использовали LiveData для подключения UserProfileViewModel к UserProfileFragment, как мы можем получить данные профиля пользователя?

В этом примере мы предполагаем, что наш backend предоставляет REST API. Мы используем библиотеку Retrofit для доступа к нашему backend, хотя вы можете использовать другую библиотеку, которая служит той же цели.

Вот наше определение Webservice , который связывается с нашим backend-ом:

interface Webservice {
   /**
    * @GET declares an HTTP GET request
    * @Path("user") annotation on the userId parameter marks it as a
    * replacement for the {user} placeholder in the @GET path
    */
   @GET("/users/{user}")
   fun getUser(@Path("user") userId: String): Call<User>
}

Первая идея для реализации ViewModel может включать прямой вызов Webservice для извлечения данных и назначения этих данных нашему объекту LiveData. Этот дизайн работает, но с его использованием наше приложение становится все сложнее поддерживать по мере роста. Это дает слишком большую ответственность классу UserProfileViewModel, что нарушает принцип разделения интересов. Кроме того, область действия ViewModel связана с жизненным циклом Activity или Fragment, что означает, что данные из Webservice теряются, когда заканчивается жизненный цикл связанного объекта пользовательского интерфейса. Такое поведение создает нежелательный пользовательский опыт.

Вместо этого наша ViewModel делегирует процесс извлечения данных новому модулю, хранилищу.

Модули репозитория обрабатывают операции с данными. Они предоставляют чистый API, так что остальная часть приложения может легко получить эти данные. Они знают, откуда взять данные и какие вызовы API следует выполнять при обновлении данных. Вы можете рассматривать репозитории как посредники между различными источниками данных, такими как постоянные модели, веб-службы и кэши.

Наш класс UserRepository, показанный в следующем фрагменте кода, использует экземпляр WebService для извлечения данных пользователя:

class UserRepository {
   private val webservice: Webservice = TODO()
   // ...
   fun getUser(userId: String): LiveData<User> {
       // Это не оптимальная реализация. Мы исправим это позже.
       val data = MutableLiveData<User>()
       webservice.getUser(userId).enqueue(object : Callback<User> {
           override fun onResponse(call: Call<User>, response: Response<User>) {
               data.value = response.body()
           }
           // Случай ошибки опущен для краткости.
           override fun onFailure(call: Call<User>, t: Throwable) {
               TODO()
           }
       })
       return data
   }
}

Хотя модуль хранилища выглядит ненужным, он служит важной цели: он абстрагирует источники данных от остальной части приложения. Теперь наш UserProfileViewModel не знает, как извлекаются данные, поэтому мы можем предоставить модели представления данные, полученные из нескольких различных реализаций извлечения данных.

Примечание. Мы упустили случай сетевых ошибок для простоты. Для альтернативной реализации, которая выставляет ошибки и статус загрузки, см. Приложение: раскрытие статуса сети.

Управление зависимостями между компонентами

Классу UserRepository выше необходим экземпляр Webservice для извлечения данных пользователя. Он мог бы просто создать экземпляр, но для этого ему также необходимо знать зависимости класса Webservice. Кроме того, UserRepository, вероятно, не единственный класс, которому нужен веб-сервис. Эта ситуация требует от нас дублирования кода, поскольку каждый класс, которому нужна ссылка на Webservice, должен знать, как его создать и его зависимости. Если каждый класс создает новый WebService, наше приложение может стать очень ресурсоемким.

Для решения этой проблемы вы можете использовать следующие шаблоны проектирования:

  • Внедрение зависимостей (DI). Внедрение зависимостей позволяет классам определять свои зависимости, не создавая их. Во время выполнения, другой класс отвечает за предоставление этих зависимостей. Мы рекомендуем библиотеку Dagger 2 для реализации внедрения зависимостей в приложениях Android. Dagger 2 автоматически создает объекты, обходя дерево зависимостей, и обеспечивает гарантии времени компиляции для зависимостей.
  • (Service location) Локатор службы: шаблон локатора службы предоставляет реестр, в котором классы могут получать свои зависимости вместо их построения.

Реализовать реестр служб проще, чем использовать DI, поэтому, если вы не знакомы с DI, вместо этого используйте шаблон: локация служб.

Эти шаблоны позволяют вам масштабировать ваш код, потому что они предоставляют четкие шаблоны для управления зависимостями без дублирования или усложнения кода. Кроме того, эти шаблоны позволяют быстро переключаться между тестовыми и производственными реализациями выборки данных.

В нашем примере приложения используется Dagger 2 для управления зависимостями объекта Webservice.

Подключите ViewModel и хранилище

Теперь мы модифицируем наш UserProfileViewModel для использования объекта UserRepository:

class UserProfileViewModel @Inject constructor(
   savedStateHandle: SavedStateHandle,
   userRepository: UserRepository
) : ViewModel() {
   val userId : String = savedStateHandle["uid"] ?:
          throw IllegalArgumentException("missing user id")
   val user : LiveData<User> = userRepository.getUser(userId)
}

Кеширование

Реализация UserRepository абстрагирует вызов объекта Webservice, но поскольку он опирается только на один источник данных, он не очень гибок.

Основная проблема с реализацией UserRepository заключается в том, что после получения данных из нашего бэкэнда эти данные нигде не хранятся. Поэтому, если пользователь покидает UserProfileFragment, а затем возвращается к нему, наше приложение должно повторно извлечь данные, даже если они не изменились.

Эта конструкция является неоптимальной по следующим причинам:

  • Это тратит ценные ресурсы трафика.
  • Это заставляет пользователя ожидать завершения нового запроса.

Чтобы устранить эти недостатки, мы добавляем новый источник данных в наш UserRepository, который кэширует объекты User в памяти:

//Информируем Dagger, что этот класс должен быть создан только единожды.
@Singleton
class UserRepository @Inject constructor(
   private val webservice: Webservice,
   // Простой кэш в памяти. Детали опущены для краткости.
   private val userCache: UserCache
) {
   fun getUser(userId: String): LiveData<User> {
       val cached = userCache.get(userId)
       if (cached != null) {
           return cached
       }
       val data = MutableLiveData<User>()
       userCache.put(userId, data)
       // Эта реализация все еще неоптимальная, но лучше, чем раньше.
       // Полная реализация также обрабатывает случаи ошибок.
       webservice.getUser(userId).enqueue(object : Callback<User> {
           override fun onResponse(call: Call<User>, response: Response<User>) {
               data.value = response.body()
           }

           // Случай ошибки опущен для краткости.
           override fun onFailure(call: Call<User>, t: Throwable) {
               TODO()
           }
       })
       return data
   }
}

Постоянные данные

Используя нашу текущую реализацию, если пользователь поворачивает устройство или уходит и немедленно возвращается в приложение, существующий пользовательский интерфейс становится видимым мгновенно, потому что хранилище извлекает данные из нашего кеша в памяти.

Тем не менее, что произойдет, если пользователь покинет приложение и вернется через несколько часов после того, как ОС Android завершит процесс? Полагаясь на нашу текущую реализацию в этой ситуации, нам нужно снова получить данные из сети. Этот процесс обновления не просто плохой пользовательский опыт; это также расточительно, потому что он потребляет ценные мобильные данные.

Вы можете решить эту проблему, кэшируя веб-запросы, но это создает ключевую новую проблему: что произойдет, если те же пользовательские данные будут отображены в запросе другого типа, например при получении списка друзей? Приложение будет отображать противоречивые данные, что в лучшем случае сбивает с толку. Например, наше приложение может отображать две разные версии данных одного и того же пользователя, если пользователь отправлял запрос списка друзей и однопользовательский запрос в разное время. Наше приложение должно было бы выяснить, как объединить эти противоречивые данные.

Правильный способ справиться с этой ситуацией — использовать постоянную модель. Нам на помощь приходит библиотека сохранения постоянных данных (БД) Room.

Room — это библиотека объектно-реляционного отображения (object-mapping), которая обеспечивает локальное сохранение данных с минимальным стандартным кодом. Во время компиляции он проверяет каждый запрос на соответствие вашей схеме данных, поэтому неработающие запросы SQL приводят к ошибкам во время компиляции, а не к сбоям во время выполнения. Room абстрагируется от некоторых базовых деталей реализации работы с необработанными таблицами SQL и запросами. Это также позволяет вам наблюдать за изменениями в данных БД, включая коллекции и запросы на соединение, выставляя такие изменения с помощью объектов LiveData. Он даже явно определяет ограничения выполнения, которые решают общие проблемы с потоками, такие как доступ к хранилищу в основном потоке.

Примечание. Если ваше приложение уже использует другое решение, такое как объектно-реляционное отображение SQLite (ORM), вам не нужно заменять существующее решение на Room. Однако, если вы пишете новое приложение или реорганизуете существующее приложение, мы рекомендуем использовать Room для сохранения данных вашего приложения. Таким образом, вы можете воспользоваться возможностями абстракции библиотеки и проверки запросов.

Чтобы использовать Room, нам нужно определить нашу локальную схему. Сначала мы добавляем аннотацию @Entity в наш класс модели данных User и аннотацию @PrimaryKey в поле id класса. Эти аннотации помечают User как таблицу в нашей базе данных, а id — как первичный ключ таблицы:

@Entity
data class User(
   @PrimaryKey private val id: String,
   private val name: String,
   private val lastName: String
)

Затем мы создаем класс базы данных, реализуя RoomDatabase для нашего приложения:

@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase()

Обратите внимание, что UserDatabase является абстрактной. Библиотека Room автоматически обеспечивает реализацию этого. Подробности смотрите в документации по Room.

Теперь нам нужен способ вставки пользовательских данных в базу данных. Для этой задачи мы создаем объект доступа к данным (DAO).

@Dao
interface UserDao {
   @Insert(onConflict = REPLACE)
   fun save(user: User)

   @Query("SELECT * FROM user WHERE id = :userId")
   fun load(userId: String): LiveData<User>
}

Обратите внимание, что метод load возвращает объект типа LiveData. Room знает, когда база данных изменена, и автоматически уведомляет всех активных наблюдателей об изменении данных. Поскольку Room использует LiveData, эта операция эффективна; он обновляет данные только при наличии хотя бы одного активного наблюдателя.

Примечание: Room проверяет недействительность на основе модификаций таблицы, что означает, что она может отправлять ложные положительные уведомления.

Определив наш класс UserDao, мы затем ссылаемся на DAO из нашего класса базы данных:

@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
   abstract fun userDao(): UserDao
}

Теперь мы можем изменить наш UserRepository, чтобы включить источник данных Room:

// Информирует Dagger, что этот класс должен быть создан только один раз.
@Singleton
class UserRepository @Inject constructor(
   private val webservice: Webservice,
   // Простой кэш в памяти. Детали опущены для краткости.
   private val executor: Executor,
   private val userDao: UserDao
) {
   fun getUser(userId: String): LiveData<User> {
       refreshUser(userId)
       // Возвращает объект LiveData непосредственно из базы данных.
       return userDao.load(userId)
   }

   private fun refreshUser(userId: String) {
       // Работает в фоновом потоке.
       executor.execute {
           // Проверьте, если пользовательские данные были получены недавно.
           val userExists = userDao.hasUser(FRESH_TIMEOUT)
           if (!userExists) {
               // Обновляем данные.
               val response = webservice.getUser(userId).execute()

               // Проверьте на ошибки здесь.

               // Обновляем базу данных. Объект LiveData автоматически обновляется,
               // поэтому нам здесь больше ничего не нужно делать.
               userDao.save(response.body()!!)
           }
       }
   }

   companion object {
       val FRESH_TIMEOUT = TimeUnit.DAYS.toMillis(1)
   }
}

Обратите внимание, что даже если мы изменили источник данных в UserRepository, нам не нужно было менять наш UserProfileViewModel или UserProfileFragment. Это небольшое обновление демонстрирует гибкость, которую обеспечивает архитектура нашего приложения. Он также отлично подходит для тестирования, потому что мы можем предоставить поддельный UserRepository и одновременно протестировать нашу производственную UserProfileViewModel.

Если пользователи вернутся через несколько дней, то приложение использующее эту архитектуру, вполне вероятно, покажет устаревшую информацию, пока хранилище не получит обновленную информацию. В зависимости от вашего варианта использования вы можете не отображать устаревшую информацию. Вместо этого вы можете отобразить данные-заполнители (placeholder data), которые показывают фиктивные значения и указывают, что ваше приложение в настоящее время загружает и загружает актуальную информацию.

Единственный источник правды

Обычно разные конечные точки REST API возвращают одни и те же данные. Например, если у нашего бэкэнда есть другая конечная точка, которая возвращает список друзей, один и тот же пользовательский объект может исходить из двух разных конечных точек API, возможно, даже с использованием разных уровней детализации. Если бы UserRepository возвращал ответ от запроса Webservice как есть, без проверки согласованности, наши пользовательские интерфейсы могли бы показывать запутанную информацию, потому что версия и формат данных из хранилища зависели бы от последней вызванной конечной точки.

По этой причине наша реализация UserRepository сохраняет ответы веб-служб в базе данных. Изменения в базе данных затем вызывают обратные вызовы для активных объектов LiveData. Используя эту модель, база данных служит единственным источником правды, и другие части приложения получают к ней доступ через наш UserRepository. Независимо от того, используете ли вы дисковый кэш, мы рекомендуем, чтобы ваш репозиторий определял источник данных как единственный источник правды для остальной части вашего приложения.

Показывать прогресс операции

В некоторых случаях использования, таких как pull-to-refresh, важно, чтобы пользовательский интерфейс показывал пользователю, что в данный момент выполняется сетевая операция. Рекомендуется отделять действие пользовательского интерфейса от фактических данных, поскольку данные могут обновляться по разным причинам. Например, если мы получили список друзей, тот же пользователь может быть снова выбран программным образом, что приведет к обновлению LiveData. С точки зрения пользовательского интерфейса, факт наличия запроса в полете — это просто еще одна точка данных, аналогичная любой другой части данных в самом объекте User.

Мы можем использовать одну из следующих стратегий для отображения согласованного статуса обновления данных в пользовательском интерфейсе независимо от того, откуда поступил запрос на обновление данных:

  • Измените getUser (), чтобы он возвращал объект типа LiveData. Этот объект будет включать в себя статус работы сети. Для примера, смотрите реализацию NetworkBoundResource в проекте GitHub android-Architecture-components.
  • Предоставьте другую общедоступную функцию в классе UserRepository, которая может возвращать состояние обновления пользователя. Этот вариант лучше использовать, если вы хотите отображать состояние сети в вашем пользовательском интерфейсе только в том случае, если процесс извлечения данных возник из явного действия пользователя, такого как pull-to-refresh.

Протестируйте каждый компонент

В разделе о разделении интересов мы упомянули, что одним из ключевых преимуществ следования этому принципу является тестируемость.

В следующем списке показано, как протестировать каждый модуль кода из нашего расширенного примера:

  • Пользовательский интерфейс и взаимодействие: используйте инструментарий Android UI тест. Лучший способ создать этот тест — использовать библиотеку Espresso. Вы можете создать фрагмент и предоставить ему макет UserProfileViewModel. Поскольку фрагмент связывается только с UserProfileViewModel, мокирование (имитация) только этого класса достаточна для полного тестирования пользовательского интерфейса вашего приложения.
  • ViewModel: вы можете протестировать класс UserProfileViewModel с помощью теста JUnit. Вам нужно только смоделировать один класс, UserRepository.
  • UserRepository: вы также можете протестировать UserRepository с помощью теста JUnit. Вам нужно испытывать Webservice и UserDao. В этих тестах проверьте следующее поведение:
    • Хранилище делает правильные вызовы веб-службы.
    • Репозиторий сохраняет результаты в базе данных.
    • Хранилище не делает ненужных запросов, если данные кэшируются и обновляются.

  • Поскольку и Webservice, и UserDao являются интерфейсами, вы можете имитировать их или создавать поддельные реализации для более сложных тестовых случаев.
  • UserDao: тестируйте классы DAO с помощью инструментальных тестов. Поскольку эти инструментальные тесты не требуют каких-либо компонентов пользовательского интерфейса, они выполняются быстро. Для каждого теста создайте базу данных в памяти, чтобы убедиться, что у теста нет побочных эффектов, таких как изменение файлов базы данных на диске…

    Внимание: Room позволяет указать реализацию базы данных, поэтому можно протестировать DAO, предоставив реализацию JSQL для SupportSQLiteOpenHelper. Однако такой подход не рекомендуется, поскольку работающая на устройстве версия SQLite может отличаться от версии SQLite на компьютере разработчика.

  • Веб-сервис: в этих тестах избегайте сетевых вызовов на ваш сервер. Для всех тестов, особенно веб-, важно быть независимым от внешнего мира. Несколько библиотек, включая MockWebServer, могут помочь вам создать поддельный локальный сервер для этих тестов.
  • Тестирование артефактов: Компоненты архитектуры предоставляют артефакт maven для управления фоновыми потоками. Артефакт тестирования ядра androidx.arch.core: содержит следующие правила JUnit:
    • InstantTaskExecutorRule: Используйте это правило для мгновенного выполнения любой фоновой операции в вызывающем потоке.
    • CountingTaskExecutorRule: Используйте это правило для ожидания фоновых операций компонентов архитектуры. Вы также можете связать это правило с Espresso в качестве ресурса в режиме ожидания.

Лучшие практики

Программирование — это творческое поле, и создание приложений для Android не является исключением. Существует много способов решения проблемы, будь то передача данных между несколькими действиями или фрагментами, извлечение удаленных данных и их локальное сохранение в автономном режиме, или любое количество других распространенных сценариев, с которыми сталкиваются нетривиальные приложения.

Хотя следующие рекомендации не являются обязательными, наш опыт показывает, что их выполнение делает вашу кодовую базу более надежной, тестируемой и поддерживаемой в долгосрочной перспективе:

Избегайте обозначения точек входа вашего приложения — таких как действия, службы и широковещательные приемники — в качестве источников данных.

Вместо этого они должны координировать свои действия только с другими компонентами, чтобы получить подмножество данных, относящихся к этой точке входа. Каждый компонент приложения довольно недолговечен, в зависимости от взаимодействия пользователя с его устройством и общего текущего состояния системы.

Создайте четкие границы ответственности между различными модулями вашего приложения.

Например, не распространяйте код, который загружает данные из сети, по нескольким классам или пакетам в вашей кодовой базе. Точно так же не определяйте множественные несвязанные обязанности — такие как кэширование данных и связывание данных — в одном классе.

Выставляйте как можно меньше от каждого модуля.

Не поддавайтесь соблазну создать ярлык «всего один», который раскрывает детали внутренней реализации из одного модуля. Вы можете выиграть немного времени в краткосрочной перспективе, но затем вы будете нести технический долг много раз по мере развития вашей кодовой базы.

Подумайте, как сделать каждый модуль тестируемым изолированно.

Например, наличие четко определенного API для извлечения данных из сети облегчает тестирование модуля, который сохраняет эти данные в локальной базе данных. Если вместо этого вы смешиваете логику этих двух модулей в одном месте или распределяете свой сетевой код по всей базе кода, тестирование становится намного сложнее — в некоторых случаях даже не невозможным.

Сосредоточьтесь на уникальном ядре вашего приложения, чтобы оно выделялось среди других приложений.

Не изобретайте велосипед заново, снова и снова записывая один и тот же шаблон. Вместо этого сосредоточьте свое время и энергию на том, что делает ваше приложение уникальным, и позвольте компонентам архитектуры Android и другим рекомендуемым библиотекам справиться с повторяющимся образцом.

Сохраняйте как можно больше актуальных и свежих данных.

Таким образом, пользователи могут наслаждаться функциональностью вашего приложения, даже если их устройство находится в автономном режиме. Помните, что не все ваши пользователи пользуются постоянным высокоскоростным подключением.

Назначьте один источник данных единственным источником истинны.

Всякий раз, когда вашему приложению требуется доступ к этому фрагменту данных, оно всегда должно происходить из этого единственного источника истины.

Дополнение: раскрытие статуса сети

В приведенном выше разделе рекомендуемой архитектуры приложения мы пропустили сетевые ошибки и состояния загрузки для упрощения фрагментов кода.

В этом разделе показано, как отобразить состояние сети с помощью класса Resource, который инкапсулирует как данные, так и их состояние.

Следующий фрагмент кода предоставляет пример реализации Resource:

// Общий класс, который содержит данные и статус о загрузке этих данных.
sealed class Resource<T>(
   val data: T? = null,
   val message: String? = null
) {
   class Success<T>(data: T) : Resource<T>(data)
   class Loading<T>(data: T? = null) : Resource<T>(data)
   class Error<T>(message: String, data: T? = null) : Resource<T>(data, message)
}

Поскольку загрузка данных из сети при отображении копии этих данных является обычной практикой, полезно создать вспомогательный класс, который можно повторно использовать в нескольких местах. Для этого примера мы создаем класс с именем NetworkBoundResource.

На следующей диаграмме показано дерево решений для NetworkBoundResource:

Он начинается с наблюдения за базой данных для ресурса. Когда запись загружается из базы данных в первый раз, NetworkBoundResource проверяет, является ли результат достаточно хорошим, чтобы его можно было отправить, или его нужно получить из сети заново. Обратите внимание, что обе эти ситуации могут возникать одновременно, учитывая, что вы, вероятно, хотите показывать кэшированные данные при обновлении их из сети.

Если сетевой вызов завершается успешно, он сохраняет ответ в базе данных и повторно инициализирует поток. В случае сбоя сетевого запроса NetworkBoundResource отправляет сбой напрямую.

Примечание. После сохранения новых данных на диск мы повторно инициализируем поток из базы данных. Однако обычно нам не нужно этого делать, потому что сама база данных отправляет изменения.

Имейте в виду, что полагаться на базу данных для отправки изменений включает в себя использование связанных побочных эффектов, что не очень хорошо, потому что неопределенное поведение этих побочных эффектов может произойти, если база данных не отправит изменения, потому что данные не изменились.

Кроме того, не отправляйте результаты, полученные из сети, поскольку это нарушит принцип единого источника истины. В конце концов, возможно, база данных содержит триггеры, которые изменяют значения данных во время операции сохранения. Точно так же не отправляйте `SUCCESS` без новых данных, потому что тогда клиент получит неверную версию данных.

В следующем фрагменте кода показан открытый API, предоставленный классом NetworkBoundResource для его подклассов:

// ResultType: Введите данные ресурса.
// RequestType: Введите ответ API.
abstract class NetworkBoundResource<ResultType, RequestType> {
   // Вызывается для сохранения результата ответа API в базу данных.
   @WorkerThread
   protected abstract fun saveCallResult(item: RequestType)

   // Вызывается с данными в базе данных, чтобы решить, следует ли извлекать
   // потенциально обновленные данные из сети.
   @MainThread
   protected abstract fun shouldFetch(data: ResultType?): Boolean

   // Вызывается для получения кэшированных данных из базы данных.
   @MainThread
   protected abstract fun loadFromDb(): LiveData<ResultType>

   // Вызывается для создания вызова API.
   @MainThread
   protected abstract fun createCall(): LiveData<ApiResponse<RequestType>>

   // Вызывается, когда получение не удается. Дочерний класс
   // может захотеть сбросить компоненты, такие как ограничитель скорости.
   protected open fun onFetchFailed() {}

   // Возвращает объект LiveData, представляющий ресурс,
   // реализованный в базовом классе.
   fun asLiveData(): LiveData<ResultType> = TODO()
}

Обратите внимание на следующие важные детали определения класса:

  • Он определяет два параметра типа, ResultType и RequestType, поскольку тип данных, возвращаемый из API, может не соответствовать типу данных, используемому локально.
  • Он использует класс ApiResponse для сетевых запросов. ApiResponse — это простая оболочка для класса Retrofit2.Call, которая преобразует ответы в экземпляры LiveData.

Полная реализация класса NetworkBoundResource появляется как часть проекта GitHub android-Architecture-components.

После создания NetworkBoundResource мы можем использовать его для записи наших привязанных к диску и сети реализаций User в классе UserRepository:

// Информирует Dagger2, что этот класс должен быть создан только один раз.
@Singleton
class UserRepository @Inject constructor(
   private val webservice: Webservice,
   private val userDao: UserDao
) {
   fun getUser(userId: String): LiveData<User> {
       return object : NetworkBoundResource<User, User>() {
           override fun saveCallResult(item: User) {
               userDao.save(item)
           }

           override fun shouldFetch(data: User?): Boolean {
               return rateLimiter.canFetch(userId) && (data == null || !isFresh(data))
           }

           override fun loadFromDb(): LiveData<User> {
               return userDao.load(userId)
           }

           override fun createCall(): LiveData<ApiResponse<User>> {
               return webservice.getUser(userId)
           }
       }.asLiveData()
   }
}

1. Требования к аппаратуре и программному обеспечению

Для устройств на базе ОС Android:

  • Android — версия 2.3 и старше;
  • оперативная память — не менее 256 Мб для работы приложения;
  • на базе процессоров Intel x86 и ARM с архитектурой ARMv5TE и выше;
  • сенсорный экран.

2. Установка, обновление, удаление мобильного приложения

Установка мобильного приложения выполняется из магазина приложений Google Play (https://play.google.com/store).

Обновление мобильного приложения выполняется средствами магазина приложений.

Для удаления мобильного приложения необходимо на мобильном устройстве запустить приложение Google Play и в нем удалить мобильное приложение.

3. Запуск мобильного приложения

Для запуска мобильного приложения необходимо найти нужное приложение в списке и нажать на его картинку. При этом в большинстве случаев будет открыто основное окно мобильного приложения. Однако если с данной программой связано несколько приложений, то будет открыт список этих приложений. В этом случае для запуска приложения следует нажать на нужное приложение в списке.

4. Работа со списком приложений

Для выполнения большинства нижеперечисленных действий необходимо попасть в список приложений. Это можно сделать из запущенного приложения с помощью главного меню, выбрав в нем пункт Список приложений. Также список приложений доступен сразу при запуске мобильного приложения, если зарегистрировано более одного приложения.

Для того чтобы изменить порядок приложений в списке, следует:

  • нажать кнопку Упорядочить — в правой части каждой строки отобразится кнопка перетаскивания.
  • нажать кнопку в строке приложения, которое нужно переместить и перетащить ее на требуемое место.

4.1. Создание приложения

Для того чтобы создать приложение для мобильной платформы, следует:

  1. Выбрать команду добавления приложения.
  2. Указать имя приложения и нажать кнопку Готово.
  3. После закрытия окна будет создано приложение.

4.2. Запуск приложения

При запуске мобильного приложения в большинстве случаев будет открыто основное окно приложения. Однако если с данной программой связано несколько приложений, то будет открыт их список. В этом случае для запуска приложения следует нажать на нужное приложение в списке.

4.3. Изменение свойств приложения

Свойства приложения изменяются в специальном окне. Для открытия окна свойств приложения следует выполнить длинное нажатие на нужном приложении. В открывшемся контекстном меню выбрать команду Изменить.

В открывшемся окне можно изменить наименование приложения, запустить его (кнопка Открыть) или удалить (кнопка Удалить).

После удаления приложения данные информационной базы восстановить невозможно.

4.4. Удаление приложения

Для удаления приложения следует выбрать команду Удалить и подтвердить свое действие: выполнить длинное нажатие на удаляемом приложении. В открывшемся контекстном меню выбрать команду Удалить.

После удаления приложения данные информационной базы восстановить невозможно.

4.5. Обновление приложения

Мобильное приложение обновляется с помощью используемого магазина приложений. После его успешного обновления мобильного приложения необходимо обновить ранее созданные приложения. Для этого достаточно запустить приложение.

Если в процессе выполнения обновления будет обнаружена необходимость реструктуризации базы данных, то будет запрошено подтверждение выполнения этой операции. В случае отказа обновление будет отложено до следующего запуска приложения.

Также имеет смысл отказаться от обновления, чтобы сделать резервную копию базы данных.

5. Интерфейс системы

Интерфейс мобильной платформы ориентирован на то, что в один момент времени на экране отображается одна форма. Под нее освобождается максимум свободного места на экране. Первой видимой формой обычно является рабочий стол. Команды, открывающие другие формы, собраны в главное меню приложения. Также это меню содержит команду возврата на рабочий стол, команды отображения информации о программе и перехода к списку приложений. Вызов главного меню приложения осуществляется с помощью системной кнопки вызова меню.

6. Работа с формами

Прокручиваться может как форма, так и элемент формы. При прокрутке таких форм существует следующая особенность:

  • если прокрутка началась внутри элемента и ему есть куда прокручиваться в момент начала действия, то прокрутка будет осуществляться для элемента;
  • в противном случае прокручиваться будет вся форма.

Полосы прокрутки на мобильных устройствах не отображаются постоянно, поэтому можно не обратить внимания на то, что форма (отчет или таблица) показывает только фрагмент информации.

Практически в каждой форме есть команды, выполняющие определенные действия в форме. Часто используемые команды представлены в виде кнопок или гиперссылок на самой форме. Редко используемые команды доступны через специальное меню Все действия, доступ к которому осуществляется с помощью кнопки .

Команды открытия вспомогательных форм реализованы с помощью специального меню, которое открывается с помощью нажатия на заголовок окна, если заголовок выделен подчеркиванием.

В форме могут располагаться табличные документы и диаграммы. В этих объектах может быть доступна функция расшифровки. Расшифровка — это действие, связанное со значением в ячейке табличного документа или элемент диаграммы. Это может быть открытие другой формы, построение другого отчета или перестроение текущего и т. д. Для выполнения расшифровки нужно нажать на интересующую ячейку или элемент диаграммы. Если расшифровка не поддерживается, ничего не произойдет.

7. Ввод текста

Для ввода различной информации предназначена экранная клавиатура. Для ее активации, как правило, достаточно нажать на поле ввода, куда требуется ввести информацию. Кнопка Готово (ДалееВвод и т. д.) приводит к переходу между полями ввода без закрытия клавиатуры.

8. Работа с файлами мультимедиа

В мобильном приложении может быть предусмотрена работа с мультимедийными возможностями устройства: создание аудиозаписи, использование встроенной камеры (для фото- и видеосъемки).

Запись аудио. Нажать кнопку диктофона в центре нижней части экрана. Чтобы остановить запись, повторно нажать кнопку диктофона. Чтобы отменить запись, нажать клавишу Назад.

Сохраненная аудиозапись будет обработана мобильным приложением.

Запись видео. Нажать кнопку записи видео в центре нижней части экрана. Чтобы остановить запись, повторно нажать кнопку записи. Чтобы отменить запись, нажать клавишу Назад.

Сохраненная видеозапись будет обработана мобильным приложением.

Съемка фотографии. Нажать кнопку фотокамеры. Для отмены съемки нажать клавишу Назад.

Сохраненный фотоснимок будет обработан мобильным приложением.

9. Местоположение на карте

В мобильном приложении может быть предусмотрена возможность работы с картографическим сервисом Google Maps (отображение адреса). В настройках телефона должна быть включена служба геопозиционирования.

Установка Google Maps в виде отдельного приложения не требуется.

10. Сообщения пользователю

Сообщения пользователю отображаются в специальной панели. Эта панель отображается на экране только в тот момент, когда в ней есть сообщения. Если панель закрывается, то список сообщений очищается. Нажатие на сообщение приводит к активации элемента формы, если сообщение связано с таковым. Для повторного открытия списка сообщений следует повторно вызвать действие, приводящее к открытию списка.

11. Резервное копирование

Резервное копирование данных выполняется в зависимости от используемого мобильного приложения.

Если используется мобильное приложение, не связанное с удаленной системой, то для резервного копирования можно воспользоваться штатными средствами используемой операционной системы мобильного устройства.

Если используемое приложение выполняет синхронизацию данных с удаленной системой, то рекомендуется выполнить сеанс синхронизации данных. Необходимость использования штатных средств резервного копирования после выполнения синхронизации зависит от наличия в мобильном приложении данных, которые не синхронизируются с удаленной системой. Если таких данных нет, то в случае возникновения проблем приложение можно пересоздать и провести начальную инициализацию данных из удаленной системы.

На устройствах под управлением iOS при создании приложения папка с данными приложения помечается как нерезервируемая. После того как изменяются данные приложения (в процессе работы с приложением), папка с данными приложения помечается как резервируемая и начинается ее резервное копирование с помощью системных средств.

Before diving into the vast field of Android Development, there is a need to understand the tool required for it. The name of the tool is Android Studio, used for developing Android Applications. Android Studio is developed by Google and Jetbrains. It’s the most widely used software for developing Android Applications. So in this article, there is a deep discussion about Android Studio. Like how to install it, tips and tricks that increase productivity while developing an Android application. So stay tuned till the end.

A-Complete-Guide-to-Learn-Android-Studio-for-Android-App-Development

So in this article, we have covered the following things:

  1. What is Android Studio?
  2. How to Install Android Studio?
  3. File Structure of a Project in Android Studio
  4. Writing first Android Studio Application
  5. Understanding the Designing Part
  6. Understanding the Coding Part
  7. Run Android App
  8. Essential Android Studio Keyboard Shortcuts
  9. Some Android Studio Tips and Tricks
  10. Complete Android Studio Tutorial

1. What is Android Studio?

Before starting and learning any programming language, the one thing required to learn to program is IDE (Integrated Development Environment). It provides a convenient way to write code. If there are any errors or bugs after compiling, they can be debugged. So, Android Studio is an official IDE for developing Android applications. It provides features that enrich productivity while writing code. It provides features like:

  • A flexible Gradle build system, easy to manage all the dependencies in a single place.
  • It allows you to run and test applications if one doesn’t have an Android smartphone. Because of its feature-rich emulator, it can run one or more emulators at a time to test client-server applications. And it also allows you to run and test physical Android Smartphones.
  • It provides a unified environment so that applications can be developed for all types of Android devices.
  • Intelligent code completion feature.
  • Predefined code templates.
  • Git integration makes developers maintain repositories, and also helps to build common app features and import sample code.
  • C++ and Native Development Kit(NDK) support.

2. How to Install Android Studio?

To install Android Studio, visit the Android Studio Download page. Make sure to install the latest stable version of the Android Studio. Before installing the Android Studio, check the system requirements on the same page, so that the system meets its minimum requirement to run Android Studio smoothly. Visit Android Install and Set up Android Studio in Windows. To find out how to install the Android Studio on Windows OS-based systems. Or one may visit the official page Install Android Studio to find out how to install Android Studio on Windows, Mac, and Linux.

3. File Structure of a Project in Android Studio

Android studio project folder structure: There are two view types of the project file structure in Android Studio. One is Android View(Summarised), another is Project View(Detailed View). Most beginners use the Android View(Summarised). Have a look at the following image to see the differences between these views. One can read the detailed info about the Android project folder structure here: Android Project folder Structure

Android Studio Application File structure:

This folder is responsible for holding the Application’s Manifest file, looking at the main application’s Business logic (Java/Kotlin), drawable files (images, vector graphics), Application’s UI layout files, mipmap (app’s icon files), colors(application’s branding color), strings(all the texts, used for localizing the application), styles(predefined or user-defined styles of application), app-level gradle file(managing the dependencies). To find out more about the app file structure read: Android Application File Structure

Application Manifest File: The manifest file is an important part of our app because it defines the structure and metadata of our application, its components, and its requirements. This file includes nodes for each of the Activities, Services, Content Providers, and Broadcast Receiver that make the application and, using Intent Filters and Permissions, determine how they co-ordinate with each other and other applications. To get more insights about the Android Manifest read: The Application Manifest File. The typical very basic manifest file looks like this:

res/values folder: The values folder used to store the values for the resources that are used in many Android projects includes features of color, styles, dimensions, padding values, margin values, etc. There are 4 main files under the res/values folder. Those are: colors.xml, dimens.xml, strings.xml, styles.xml. Read on the res/values folder to find out the details of the res/values folder. Have a look at the following image where it’s found:

build.gradle file: Gradle is a build system (open source) that is used to automate building, testing, deployment, etc. Every Android project needs a Gradle for generating an apk from the .java and .xml files in the project. It is located in the root project directory and its main function is to define the build configurations that will be applied to all the modules in the project. Read: build.gradle and get to know more about the various build.gradle. Have a look at the following image to get the location of build.gradle files.

Assets Folder: Assets provide a way to add arbitrary files like text, XML, HTML, fonts, music, and video in the application. If one tries to add these files as “resources“, Android will treat them into its resource system and you will be unable to get the raw data. Read Assets Folder in Android Studio for a detailed view of the assets folder. Have a look at the following image to get the location of the assets folder in Android Studio.

Resource Raw Folder: The raw folder in Android is used to keep mp3, mp4, sfb files, etc. The raw folder is created inside the res folder: main/res/raw. So we will simply create it inside the res folder. Read: Resource Raw Folder in Android Studio to know details about the raw folder. Have a look at the following image to get the location of the folder where it needs to be created:

Logcat window: Logcat Window is the place where various messages can be printed when an application runs. Suppose, you are running your application and the program crashes, unfortunately. Then, Logcat Window is going to help you to debug the output by collecting and viewing all the messages that your emulator throws. Read: Logcat window in Android Studio to know more about the Logcat in Android Studio. Have a look at the following image to locate the Logcat window:

debug.keystore file: is one of the most important files which is present in almost every application when we download that app from the Google Play Store. This file is basically considered as the certificate of any application which is being verified by Google each and every time. Each app that you are using on your phone needs to be signed. Read: Where is debug.keystore in Android Studio? to know where it is located and to generate the certificate for the Android app.

4. Writing first Android Studio Application

As in features of Android Studio, it’s mentioned that Android Studio provides various numbers of templates by default. It allows you to select them before creating a project. To create a new project click on “Create New Project“.

After clicking, another new window pops up to select several predefined templates. Pick what suits the current project needs. If there is no desired template, choose “Empty Activity” and click on the “Next” button.

To find out more on this, refer to Android Studio Main Window

After clicking on the Next button, another window pops up asking to enter the name of the project, package name, location to save the project, programming language to select(as two programming languages are supporting Kotlin & Java), and the minimum SDK API level (The minimum API level that is supported by the app). After entering the information, click on the “Finish” button.

Congratulations, the first Android Studio project is ready. Initially, it shows the tip of the day, which gives tips to improve work efficiency. Before going to explore the Android Studio, get familiar with the initial screen which is shown below.

For a better understanding of the Android Studio environment, it has been divided into 4 parts:

1. Menu Part: In this section, it provides options to create a new project, open an existing android studio project, a button to run the application, dropdown for selecting the desired device to run and test an application on.

2. Coding Area: This section provides for writing code for files like .xml, .java, .kt. It allows you to open multiple files at a time in different tabs, but it allows you to edit one file at a time.

3. Project Structure: This area allows us to explore every file of the project. There are various views of the structure. Android is a summarised view of the project structure hierarchy and Project is a detailed view of the project hierarchy. Have a look at the following image.

4. Current Execution Part: One of the most important parts of the Android Studio environment. It provides a detailed view of the current execution of the process or activity. It shows what errors, build outputs, logcat results, etc.

5. Understanding the Designing Part

All the UI layouts of the application can be found under the res/layout directory. These are of the .xml extension, responsible for building the UIs for application. Android Studio provides two types of ways of designing UI for applications. One is Text, where one needs to design the UI by hardcoding and one is the Design section that provides a convenient drag and drop mechanism for building UI. Have a look at the following image which shows how the code is being written, it goes on to show the result in the right pane.

The following image shows the drag and drop environment for widgets to pick and add in the UI of the application. One can switch to the Design layout by clicking on the bottom left button, shown as the following.

6. Understanding the Coding Part

As we have understood the design part similarly, another main part is the coding part. In the image below you can see a file named MainActivity.kt. Yes, this is the file where you write the backend part. The logic part. For example, you want to add two numbers. So, after entering two numbers in the EditText, when the user clicks on the Button, it will give the output as the sum of two numbers. So to calculate the sum, you have to write the logic in its part.

Note: If you select Language as Java during project creation, then the file name will be MainActivity.java.

7. Run Android App

To run an application there are two ways to do it. One is using an emulator, another is using a physical device by connecting it through a USB cable. Refer to How to install Android Virtual Device(AVD) how to set up an android virtual device or refer to How to Run the Android App on a Real Device? setting up a real physical android device and running applications on it. Have a look at the following image of what the Android Virtual Device looks like on the first run of the application.

8. Essential Android Studio Keyboard Shortcuts

Keyboard shortcuts make work a lot easier and increase productivity. One may refer to 10 Important Android Studio Shortcuts You Need the Most getting to know the essential keyboard shortcuts for Android Studio.

9. Android Studio Tips and Tricks

There are some tips and tricks that can be used to master Android development using Android Studio. These tips and tricks are:

  • Setting up the theme of Android Studio
  • Changing color of Logcat
  • Fast Searching
  • Split Screen
  • Distraction-free mode
  • Code completion
  • Multi cursor feature and many more

You may refer to the following articles to find out more about Android Studio Tips and Tricks

  • Top 20 Tips and Tricks of Android Studio
  • 10 Android Studio Tips and Tricks For Android Developers

10. For the complete Android Studio Tutorial, you may refer to this article: Android Studio Tutorial

Android – базирующаяся на ОС Linux операционная система с открытым исходным кодом, предназначенная для мобильных устройств – таких, как, например, смартфоны или планшетные компьютеры.

Это руководство предназначено для введения в основные понятия программирования под Android, так что после его изучения вы будете понимать некоторые базовые концепции программирования под эту ОС.

От вас же, в свою очередь, требуется только желание и базовое понимание программирования на языке Java. Не так много, правда? Что ж, начнём!

Среда разработки

Для разработки приложений под Android можно использовать любые из перечисленных операционных систем:

  • Microsoft Windows XP или более поздняя версия
  • Mac OS X 10.5.8 или более поздняя версия с чипом Intel
  • Linux, включающая GNU C Library 2.7 или более позднюю версию

При этом все необходимые инструменты для разработки Android-приложений находятся в свободном доступе и вы можете загрузить их из Интернета. Для того, чтобы начать создавать приложения под Android, вам понадобятся:

  • Java JDK5 или более поздняя версия
  • Android Studio

Структура приложений

Поздравляем, ваше оборудование готово к работе! Однако прежде чем приступить к вашему первому приложению, поговорим о том, что из себя представляет приложение на Android и из чего оно состоит.

Компоненты приложения являются своего рода «строительными блоками» для приложения Android. Эти компоненты связаны файлом-манифестом приложения AndroidManifest.xml, который описывает каждый компонент приложения и взаимодействие этих компонентов между собой.

Есть четыре базовых типа компонентов, которые могут быть использованы в приложении Android:

  • Операции (Activities) представляют собой элементы пользовательского интерфейса (одна операция – один экран) и отвечают за взаимодействие пользователя с экраном мобильного устройства;
  • Службы (Services) представляют собой длительные операции, работающие в фоновом режиме и не имеющие пользовательского интерфейса (например, передача данных), вместо этого они, как правило, запускаются иными элементами, уже имеющими пользовательский интерфейс, и взаимодействуют с ними;
  • Приемники широковещательных сообщений (Broadcast receivers) представляют собой компоненты, реагирующие на объявления самой ОС, передаваемые всей системе (как хороший пример – объявление о низком уровне заряда батареи устройства). Они также не имеют пользовательского интерфейса, однако могут передавать данные другим компонентам, где они демонстрируются пользователю в виде уведомлений;
  • Поставщики контента (Content providers) представляют собой компоненты, управляющие взаимодействием приложения с его базой данных — посредством поставщика контента другие компоненты приложения могут запрашивать или изменять данные.

Помимо четырех базовых типов, существуют дополнительные типы компонентов, используемые для выстраивания взаимодействий и связей как между базовыми типами компонентов, так и между компонентами и внешними элементами. К ним относятся:

  • Фрагменты (Fragments) – части пользовательского интерфейса в Операциях (см. выше);
  • Виды (Views) – элементы пользовательского интерфейса, отображаемые на экране, например, кнопки, списки и т. д.;
  • Макеты (Layouts) – определяют элементы пользовательского интерфейса, их свойства и расположение;
  • Намерения (Intents) – соединяют вместе различные компоненты приложения или связывают друг с другом работу разных приложений;
  • Ресурсы (Resources) – внешние элементы, такие, как строки, константы или изображения;
  • Манифест (Manifest) – конфигурационный файл приложения.

Теперь, когда вы получили базовое понимание о структуре приложений на Android, хотелось бы предложить вам самим попробовать создать свое первое приложение.

Первое приложение

Итак, давайте приступим к созданию простого Android-приложения, которое будет выводить на экран «Hello World!».

У вас к этому времени уже должен быть установлен Android Studio последней версии. Ниже будет приведена небольшая пошаговая инструкция:

  1. Откройте Android Studio.
  2. В открывшемся окне кликните на «Start a new Android Studio project», чтобы создать новый проект.
  3. В открывшемся окне в строку «Application name» введите название вашего будущего приложения. Нажмите Next.
  4. В следующем окне вам нужно выбрать тип устройств, для которых создается приложение – в нашем случае необходимо выбрать «Phone and Tablet» (смартфоны и планшетные компьютеры), а в выпадающем списке под названием «Minimum SDK» нужно выбрать версию Android, для которой создается приложение (обычно указывается самая ранняя версия, способная запустить приложение) – в нашем конкретном случае выберем версию Android 6.0. Если в вашей версии есть возможность выбрать язык программирования (выпадающее окно Language), выберите пункт “Java”. Остальные опции можно оставить без изменений. Нажмите Next.
  5. На следующем этапе выберите пункт Empty Activity – это будет означать, что экран нашего приложения не будет иметь никаких дополнительных элементов. Нажмите Next.

Теперь перед вами открылась привычная среда разработки. К сожалению или к счастью, но сейчас вам не нужно будет писать код – среда разработки уже сделала это за вас, создав файлы для приложения, выводящего «Hello world!» на экран, по умолчанию. Вместо этого хотелось бы обратить ваше внимание на несколько созданных файлов и папок, найти которые вы можете в колонке слева, отображающей все элементы проекта.

  • Файл MainActivity.java

В папке «Java» содержатся исходные файлы формата .java для вашего приложения. По умолчанию в ней находится исходный файл MainActivity.java, имеющий класс Операция – он запускается при нажатии пользователем на иконку приложения на устройстве. Этот файл содержит главный код приложения, и именно он преобразуется в файл .exe для запуска приложения на устройстве.

  • Файл AndroidManifest.xml

Это файл типа «Манифест», который описывает основные характеристики приложения и определяет каждый из его компонентов. Он является своего рода интерфейсом между ОС Android и вашим приложением – если компонент не упомянут в этом файле, он не будет отображен и в операционной системе.

  • Файл Build.gradle

Это автоматически генерируемый файл, содержащий определённые данные касательно приложения – такие, как, например, версия SDK.

Запустить приложение можно двумя способами: на реальном устройстве или на эмуляторе в самой среде разработки. В нашем случае мы рассмотрим более универсальный случай – запуск на эмуляторе, полностью имитирующем работу устройства с операционной системой Android.

Запуск приложения на эмуляторе

Попытайтесь запустить приложение кнопкой «Run» – в появившемся диалоговом окне выберите пункт «Create New Virtual Device». В последующих окнах нужно будет выбрать размер экрана и версию Android – помните, что она должна быть не ниже, чем указанная на этапе создания проекта. В случае, если данная версия Android будет отсутствовать на компьютере, Android Studio предложит ее загрузить. Остальные пункты можно оставить без изменений – на данный момент нет необходимости их изменять. После выбора всех настроек нажмите кнопку «Finish», и если вы увидели на своем мониторе экран телефона с названием вашего приложения сверху и с надписью «Hello world!» на экране, значит, вы можете себя поздравить – вы создали свое первое Android-приложение!

Теперь у вас есть базовое понимание и минимальный опыт в создании приложений на Android. Этого, разумеется, совершенно не хватит, чтобы заниматься разработкой, но это необходимый для дальнейшего развития фундамент – продолжайте изучать и практиковаться! Всего наилучшего!

Также можно научиться создавать приложения на Android и другие ОС после прохождения нашего шестимесячного курса «Профессия: Разработчик» 👉 Узнать подробности!

Этот туториал содержит информацию по разработке приложений на Android для совсем начинающих.

Изучение разработки приложений на Android может показаться сложным, но открывает целый мир возможностей. Ведь возможно вы сможете создать «хитовое» приложение, которое изменит то, как мы работаем или взаимодействуем друг с другом. Может быть, вы разработаете инструмент, которым поможет вам улучшить ваш собственный рабочий процесс. Или, возможно, вы просто приобретете новый навык и получите отличную работу!

В любом случае, изучение разработки приложений на Android может оказаться не таким сложным, как вы думаете, если понимать, как все это работает, и иметь путеводитель, который поможет вам в этом. Этот туториал — тот самый путеводитель!

Шаг 1. Скачайте инструменты, необходимые для разработки приложений на Android.

Во-первых, вам нужно создать среду разработки, чтобы ваш десктоп был готов поддерживать ваши цели Android-разработки. Для этого вам понадобятся Android Studio и Android SDK. Удобно, что оба упакованы вместе в одной загрузке, которую вы можете найти здесь.

Android Studio — это IDE. Что означает “integrated development environment” (интегрированная среда разработки), которая, по сути, представляет собой интерфейс, в который вы можете ввести свой код (в первую очередь, Java или Kotlin) и получить доступ ко всем инструментам, необходимым для разработки. Android Studio позволяет получать доступ к библиотекам и API из Android SDK, тем самым предоставляя вам доступ к собственным функциям операционной системы. Вы также сможете встроить приложение в APK с помощью Gradle, протестировать его через «виртуальное устройство» (эмулятор) и отладить код во время работы.

С учетом всего вышесказанного имейте в виду, что существуют и другие варианты разработки вашего приложения на Android. Например, Unity — очень мощный инструмент для разработки кроссплатформенных игр, который также поддерживает Android. Есть еще Visual Studio с Xamarin — отличное сочетание для создания кроссплатформенных приложений на C#.

Для того чтобы начать, Android Studio является лучшим местом (за исключением разработки игр для Android), так как предоставляет все дополнительные инструменты и ресурсы в одном месте.

К счастью, настройка очень проста, и вам нужно только следовать инструкциям.

Шаг 2. Создайте новый проект

После того, как вы установили Android Studio, следующим шагом будет создание нового проекта. Это простой процесс, но вам нужно будет принять решения, влияющие на дальнейшую разработку приложения на Android.

Перейдите в File> New> New Project. Теперь вам будет предложено выбрать Project Template (шаблон проекта). Этот шаг определяет код и элементы пользовательского интерфейса, которые будут включены в ваше новое приложение при его загрузке.

Activity (активити) относится к screen (экрану) в вашем приложении. То есть, проект с No Activity будет полностью пустым, за исключением базовой файловой структуры. Basic Activity же создаст стартовый экран для вашего приложения, добавит кнопку внизу и гамбургер-меню вверху. Это общие элементы во многих приложениях на Android, так что это поможет сэкономить вам время.

Тем не менее, когда вы только начинаете заниматься разработкой, это может усложнить ситуацию,  По этой причине мы выберем No Activity. Этим мы создаем активити и несколько файлов, но не добавляем много дополнительного кода.

Выберите имя и package name вашего нового приложения. Имя — это то, что увидит ваша аудитория, когда приложение будет установлено на их устройство. Рackage name — это внутренняя ссылка, используемая Android, чтобы отличать его от других приложений. Она должен быть составлена с использованием вашего домена верхнего уровня (например, .com), имени домена и имени приложения.

Например: com.androidauthority.sampleapp.

Если у вас нет домена или компании, просто используйте com, а затем укажите что-нибудь, что вам нравится!

Вам также нужно будет решить, где вы хотите сохранить файлы и на каком языке вы собираетесь писать код: Java или Kotlin.

Сравниваем Java и Kotlin в разработке приложений на Android

Одно из важнейших решений, которое вам, как разработчику Android, придется принять, — это изучать Kotlin или Java. Оба языка официально поддерживаются Google и Android Studio, но между ними есть некоторые отличия.

Java поддерживается Google дольше. Java — это язык, который разработчики использовали для создания приложений на Android в течение многих лет. Java также является одним из самых востребованных языков программирования в мире. Будучи старейшим языком программирования на Android, Java имеет немного больше поддержки, чем Kotlin.

Kotlin, с другой стороны, стал предпочтительным выбором Google для разработки под Android. Мы по умолчанию выберем этот язык  при создании нового приложения, которое, вероятно, станет более распространенным в будущем. С Kotlin также значительно легче разобраться, если вы полный новичок.

По этим причинам Kotlin, вероятно, является предпочтительным языком для разработчиков на Android, которые учатся для развлечения или не стремятся разрабатывать для других платформ. Но если вы хотите стать профессиональным разработчиком, то изучать Java тоже имеет смысл.

Минимальный SDK

Наконец, вам также необходимо учитывать свой минимальный SDK. Это самая низкая версия Android, которую вы хотите, чтобы ваше приложение поддерживало.

Чем более старую версию Android вы укажете, тем шире будет ваша потенциальная аудитория. Имейте в виду, что скорость перехода на последние версии Android относительно низкая, поэтому использование последнего обновления не позволит многим пользователям потестировать то, что вы создали.

Однако вы сможете получить доступ к последним функциям Android только в том случае, если нацелены на более новую версию. Если вам нравится звук пузырей в чате, вы нужно использовать самую последнюю версию.

Шаг 3. Ознакомьтесь с файлами

Я помню, как впервые попробовал разрабатывать приложения для Android. Я загрузил Android Studio и сразу же был сбит с толку увиденным. Есть так много разных файлов, несколько типов кода, папок и многого другого! Это было далеко от единственного пустого файла, с которым я привык работать в Python или даже QBasic (кто-нибудь помнит QBasic??).Выглядеть это может довольно сложно, но вот что вам нужно знать.

Открытый файл — это MainActivity.java или MainActivity.kt. Это основной файл логики для активити, которое будет определять поведение вашего приложения. Посмотрите налево, и вы увидите, что этот файл находится в: MyApplication> app> src> main> java> com> companyname> myapplication.

Используемые папки важны для разработки приложений на Android, поскольку они помогают Android Studio и Gradle все найти и правильно построить (подробнее о Gradle чуть позже). Переименовать их как вам захочется вы не можете!

Вы заметите, что на главной странице уже есть код. Это то, что мы называем «шаблонным кодом», что означает, что это код, который практически идентичен для разных проектов приложений и необходим для работы основных функций. Шаблонный код — это то, что вы будете вводить снова и снова! Одним из преимуществ Kotlin является то, что он требует меньше шаблонов, а это означает, что у вас будет меньше кода на экране.

Файлы layout

Задача этого кода сообщить Android, где находится связанный файл layout. Файл layout немного отличается от файла Kotlin/Java. Это определяет способ того, как будет выглядит активити, и позволяет вам добавлять такие вещи, как кнопки, текст и окна браузера.

Вы найдете этот файл в: MyApplication> app> src> res> layout.

Он будет называться activity_main.xml. Обратите внимание, что файлы, хранящиеся в папке с ресурсами, не могут использовать заглавные буквы; им нужно использовать символ подчеркивания, чтобы разделить слова между собой. Дважды щелкните этот файл, и он откроется в главном окне, где вы редактируете свой код. Обратите внимание, что вы можете переключаться между открытыми файлами, используя вкладки вверху.

Вы можете просмотреть этот файл через вью Code, Design или вариант раздельный, в котором эти окна отображаются рядом друг с другом. В правом верхнем углу есть кнопки для переключения режима.

В варианте «Design» вы можете перетаскивать различные виджеты на экран. В варианте Code отображается загрузка XML-сценария. Когда вы добавляете новые виджеты через Design, этот скрипт обновляется. Точно так же вы можете настроить здесь свойства виджетов (называемых «вьюхами») и увидеть их отражение в режиме реального времени через вью Code.

В подавляющем большинстве приложений вам нужно будет создавать новый файл Java/Kotlin и соответствующий файл XML каждый раз, когда вам потребуется новое активити. И для тех, кто задавался вопросом: да, это означает, что вам нужно изучить либо Kotlin, либо Java и XML. Это может показаться головной болью, но на самом деле это упрощает процесс в долгосрочной перспективе.

Остальные файлы и папки

Однако здесь гораздо больше файлов и папок, так что же они все делают?

По правде говоря, вам не нужно знать, что здесь есть. Но есть кое-что, о чем полезно знать:

Android Manifest: это XML-файл в папке res, который определяет важные функции вашего приложения. Включает ориентацию приложения, действия, которые вы хотите включить в него, версию и т.д.

Drawable: эта папка находится в res. Сюда вы будете помещать такие вещи, как изображения, на которые хотите ссылаться позже.

Values: эта папка ресурсов — полезное место для хранения значений, которые будут использоваться глобально в вашем приложении. Например, это могут быть цветовые коды (упрощающие изменение внешнего вида всего приложения). Вы определите эти значения в отдельных файлах XML, например в colors.xml.

Gradle: Gradle — это инструмент, который собирает все ваши файлы и объединяет их в рабочий APK для тестирования. Он также полезен для создания превью и т.д. Вам не нужно беспокоиться о файлах, находящихся здесь, но если вы хотите добавить зависимости, вы это сделаете именно здесь. Зависимости — это внешние библиотеки, которые позволяют вам получить доступ к дополнительным функциям из вашего собственного кода.

Шаг 4. Протестируйте свое приложение

Первое, что вы должны сделать, знакомясь с любым новым языком программирования, — это создать приложение с надписью Hello World. К счастью, в данном случае это очень просто, так как находящийся здесь код именно это и делает! Если вы посмотрите на XML, то увидите, что он включает маленький ярлык, который просто говорит: Hello World!

Если вы посмотрите на элементы управления вверху, вы увидите небольшую зеленую стрелку воспроизведения. Слева от нее находится раскрывающееся меню с именем телефона. Когда вы установили Android Studio, он также должен был установить Android system image вместе с Virtual Device Manager. Другими словами, у вас уже должен быть установлен и готов к работе эмулятор Android! Нажав на эту зеленую стрелку, вы сможете запустить и протестировать свое приложение! Обратите внимание, что вы также сможете использовать симулятор телефона, как если бы это было настоящее устройство.

Вы можете изменить настройки своего виртуального устройства, такие как размер экрана, версию Android, пространство и т.д., перейдя в Tools > AVD Manager. Там же вы можете скачать новые системные изображения. Убедитесь, что ваше виртуальное устройство соответствует минимальному пакету SDK, установленному вами в начале, или превышает его.

Кроме того, вы можете попробовать подключить к компьютеру физическое устройство и использовать его для тестирования нового приложения. Однако вам нужно включить Developer Options (параметры разработчика) и включить USB Debugging (отладку ошибок).

Шаг 5: Действуйте!

Лучший способ научиться разрабатывать приложения для Android — это действовать! Это означает, что вы должны попытаться отредактировать код перед вами, чтобы увидеть, сможете ли вы заставить его сделать что-то новое.

Изменить отображаемое сообщение так же просто, как зайти в свой XML и изменить строку с надписью «Hello World!» в «Howdy World!«

Но что, если вы хотите добавить в свое творение какой-то интерактивный элемент? В этом случае вы можете разрешить пользователю щелкнуть на кнопку, чтобы изменить текст.

Во-первых, вам нужно поместить эту строку в тег TextView в файле activity_main.xml:

#Руководства

  • 18 июл 2018

  • 1

Платформа Android открытая, поэтому каждый может написать своё приложение и распространять его через каталоги программ. Все инструменты бесплатны.

 vlada_maestro / shutterstock

Анатолий Ализар

Пишет про разработку в Skillbox Media. Работал главным редактором сайта «Хабрахабр», ведёт корпоративные блоги.

Язык программирования для мобильной разработки на Android очень простой — это Java. Сейчас Google активно продвигает Kotlin как язык, который сможет заменить Java. Приложения пишут и на C++.

Создание простейшего приложения состоит из нескольких этапов:

  • проект в Android Studio;
  • создание пользовательского интерфейса;
  • добавление активностей, навигации и действий;
  • тест-драйв приложения в эмуляторе.

Первым делом установите программу Android Studio. Это официальная среда разработки (IDE) для Android, она работает на Windows, macOS и Linux. Хотя при разработке программ для Android можно использовать и другие среды, кроме Android Studio.

Если на компьютере не установлены Android SDK и другие компоненты, то Android Studio автоматически скачает их. Android SDK — это среда программирования, в которую входят библиотеки, исполняемые файлы, скрипты, документация и т.д.

Android SDK компилирует код вместе с любыми данными и ресурсами в файл с расширением .apk. Он содержит всё необходимое для установки приложения на Android-устройство.

Полезно установить и эмулятор Android, чтобы запускать и тестировать приложения. Эмулятор поставляется в комплекте с Android Studio.

Когда все инструменты установлены, можно создать первый проект. Но сначала нужно разобраться с основными понятиями.

Android-приложение состоит из четырёх компонентов. Каждый компонент — это точка входа, через которую система или пользователь может получить доступ.

  • Активность (activity) — элементы интерактивного пользовательского интерфейса.
    Одна активность задействует другую и передаёт информацию о том, что намерен делать пользователь, через класс Intent (намерения). Активности подобны веб-страницам, а намерения — ссылкам между ними. Запуск приложения — это активность Main.
  • Сервис (service) — универсальная точка входа для поддержания работы приложения в фоновом режиме.
    Этот компонент выполняет длительные операции или работу для удалённых процессов без визуального интерфейса.
  • Широковещательный приемник (broadcast receiver) транслирует нескольким участникам намерения из приложения.
  • Поставщик содержимого (content provider) управляет общим набором данных приложения из файловой системы, базы данных SQLite, интернета или другого хранилища.

Теперь попробуем сделать своё приложение для Android.

Выбираем название приложения, домен компании, путь к проекту и название пакета. Указываем, включить ли поддержку опциональных языков программирования C++ и Kotlin.

Задаём одну или несколько целевых платформ для сборки. Для этого используется SDK и AVD, менеджер виртуальных устройств Android. Инструмент позволяет устанавливать в SDK пакеты, которые поддерживают несколько версий ОС Android и несколько уровней API (интерфейсов программирования приложений).


Справка

Чем ниже версия Android, тем больше устройств, на которых приложение запустится. Чем выше версия, тем богаче функциональность API.


Выбираем основную активность, которая будет запускаться при нажатии на иконку приложения, и даём ей имя.

После нескольких минут сборки Android Studio открывает интерфейс IDE. Здесь три основных момента.

Если выбрать в выпадающем меню вид Android, то вы увидите файлы проекта. Например, наша основная активность называется app > java > ru.skillbox.skillboxapp > FullscreenActivity. При создании проекта мы указали вместо активности Main полноэкранную активность.

Далее можно посмотреть файл app > res > layout > activity_fullscreen.xml. Это XML-файл с макетом для UI нашей основной активности.

Наконец, третий важный файл app > manifests > AndroidManifest.xml описывает фундаментальные характеристики приложения и определяет все его компоненты.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="ru.skillbox.skillboxapp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".FullscreenActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            android:theme="@style/FullscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Созданное нами приложение — это одна активность, которая запускается в полноэкранном режиме и не имеет графических элементов.

Запускаем на Android-устройстве или в эмуляторе.

Смартфон или планшет для этого подключаем в режиме USB-отладки, которая активируется в Настройках разработчика в меню Настройки.

Для запуска в эмуляторе нажимаем в Android Studio кнопку Run в меню Run (Shift+F10). Выбираем подходящее устройство и версию ОС, портретную или ландшафтную (альбомную) ориентацию.

Android Studio установит эмулятор и запустит его.

Пользовательский интерфейс Android-приложения создаётся через иерархию макетов (layouts, объекты ViewGroup) и виджетов (объекты View). Макеты управляют расположением дочерних виджетов на экране. Сами виджеты — это непосредственно компоненты UI: кнопки, текстовые поля на экране и т.п.

Интерфейс активностей создаётся в Android Studio в редакторе макетов (Layout Editor) и хранится по большей части в XML-файлах.

  • Открываем файл app > res > layout > activity_fullscreen.xml.
  • Добавляем на экран из палитры (Palette) виджеты перетаскиванием мышью.
  • Например, берём текстовое поле (PlainText). Это виджет EditText, куда пользователь может вводить текст.
  • Добавляем кнопки и другие нужные элементы.

Также на экран можно перетащить кнопки и другие элементы.

Предположим, мы создали активность с текстовым полем и кнопкой «Отправить». После этого нужно написать, что конкретно будет происходить при нажатии кнопки «Отправить».

  • Заходим в код app > java > FullscreenActivity.
  • Добавляем метод SendMessage() в класс FullscreenActivity, чтобы при нажатии на кнопку вызывался этот метод.
  • Создаём намерения (класс Intent) для перехода от одной активности к другой, новые активности, навигацию и всё остальное, что необходимо для приложения.

И, конечно, начинаем мечтать, как монетизировать приложение.

Научитесь: Профессия Мобильный разработчик
Узнать больше

В этой статье собраны полезные ресурсы, которые могут пригодиться всем Android-разработчикам, независимо от уровня знаний.

Также советуем взглянуть на наш вводный материал — рассказываем, как начать разрабатывать под Android.

Для новичков

Ресурсы, которые могут оказаться полезными для любого Java-программиста, начинающего разрабатывать под Android.

  • Android-разработка для начинающих

Простой курс для новичков, разработанный Google, поможет быстро изучить основы и фундаментальные концепции Android-разработки.

  • Знакомство с Android-разработкой

Простое, легкое и полное руководство для начинающих разработчиков, желающих написать своё первое приложение на Android.

  • Android Development CodeLabs

Это один из лучших ресурсов, о котором должны узнать все начинающие Android-разработчики.

  • Глоссарий Google Android

Если вы вступаете в огромный мир разработки под Android, то очевидно, что вы столкнётесь со множеством новых понятий и терминов. Не беспокойтесь, Google разработал интерактивный и простой в использовании глоссарий с примерами кода, который облегчит вашу жизнь.

  • Официальное руководство по Android-разработке

Официальное руководство для разработчиков под Android от Google. Оно охватывает основные концепции с большим количеством примеров кода.

  • Основы XML

Не знакомы с XML? Самое время изучить, потому что он используется для дизайна макетов в Android. Это не займет много времени.

  • Руководство для начинающих по HTTP и REST

Если вы собираетесь использовать интернет-сервисы через API для вашего Android-приложения, тогда стоит познакомиться с HTTP и REST.


Для опытных разработчиков

Если вы занимаетесь разработкой под Android не первый год, то вот несколько хороших ресурсов, которые помогут улучшить ваши навыки программирования на Android.

  • Разработка приложений для Android

Хороший курс от Google, который идеально подходит для повышения квалификации.

  • Распространённые шаблоны проектирования для Android

Если вы ищите элегантные способы решения критических проблем в разработке программного обеспечения, то обратите внимание на подборку самых распространенных шаблонов проектирования. Они смогут вам в этом помочь.

  • Как освоить Android: что разработчики могут извлечь из 21 приложения

Существует большое количество open source Android-приложений. Не беспокойтесь, если вы не знаете, какие из них могут помочь улучшить навыки разработки. Эта статья расскажет вам об этом.

  • MVC против MVP против MVVM на Android

Чтобы усовершенствовать процессы разработки, тестирования, отладки и обслуживания вашего Android-приложения, ознакомьтесь с лучшими подходами к архитектуре.

  • Современный Android: Activity и Fragment

Эта статья расскажет вам о современных способах создания приложений.

  • Учебник RxAndroid

Погрузитесь в мир реактивного программирования под Android с помощью этого простого учебника.

  • Погружение в конструкторы Android View

Получите подробное представление о конструкторах Android View, о том, как они работают и как их эффективно использовать при разработке приложений.

  • Изучение Android Core: Looper, Handler и HandlerThread

Если вы хотите понять, как устроен асинхронный мир фреймворков Android, и использовать его для создания высококачественных приложений — прочтите эту статью.

  • Views и ViewGroups

Подробный учебник, рассказывающий о том, как работают Views и ViewGroups в Android и как вы можете совершенствовать компоненты пользовательского интерфейса.

  • Режимы запуска Android Activity

Не все разработчики правильно понимают, как работают различные режимы запуска в Android и как использовать их для создания идеальной навигации в своём приложении. Это статья расставит всё по своим местам.

  • Как опубликовать собственную библиотеку

Вы уже давно используете библиотеки в своих приложениях под Android и хотите внести свой вклад в сообщество? Вот полное и подробное руководство по публикации собственной библиотеки.

  • Релиз приложения в Google Play Store

Узнайте, как сделать успешный запуск своего приложения в Play Market.

  • Архитектура Android

Этот GitHub-репозиторий станет жемчужиной для всех тех, кто хочет узнать о различных инструментах и ​​шаблонах для разработки приложений для Android.

  • Android Instant Apps

Если вы не знаете, что выбрать: нативные или веб-приложения — эта статья для вас.

  • Лучшие инструменты для разработчиков Android-приложений

Если вы разрабатываете приложения для Android уже довольно давно и хотите улучшить свою производительность и рабочий процесс разработки, то эти инструменты помогут вам.

  • Профессиональное использование Android Studio

Вы используете Android Studio каждый день для разработки своих приложений, но, возможно, и не догадываетесь, что эта IDE может быть еще мощнее.


Лучшие практики Android-разработки

Следование лучшим практикам поможет повысить качество приложения и облегчить командную разработку.

  • Рекомендации по разработке под Android

Легкая и полезная статья, объясняющая некоторые аспекты лучших практик разработки под Android.

  • Знакомство с strings.xml

В этой статье мы расскажем о лучших методах использования файла ресурсов strings.xml.

  • Гайдлайны Android

Один из лучших и наиболее полных ресурсов о лучших практиках и гайдлайнах по различным аспектам разработки Android, охватывающий почти все, что вам нужно знать.

  • Android for Work

Эта статья поможет узнать, как наилучшим образом использовать Android for Work в ваших проектах.

  • Android-разработка: некоторые из лучших практик

Чрезвычайно полезный список лучших практик Android-разработки.

  • Шпаргалка по Java для Android

Книга «Effective Java» считается одной из лучших для написания высококачественного поддерживаемого Java-кода. Эта статья посвящена тому, как вы можете наилучшим образом использовать описанные в ней методы и принципы в разработке под Android.

  • Топ-7 советов для RxJava под Android

Если вы выбрали реактивный способ создания приложений под Android, то эти советы помогут вам избежать распространенные ошибки и использовать RxJava максимально эффективно.

  • Прячем данные в Android-приложениях

Углубленная статья о плюсах и минусах некоторых распространенных приемов хранения секретов (паролей, ключей API и другой информации) в приложениях Android.


Проектирование красивых приложений

Приложение считается неполным без хорошего пользовательского интерфейса. Чистый и красивый интерфейс — вот что делает ваше приложение привлекательным и выделяет его среди остальных.

  • Material Design: глубокий взгляд

Хорошо написанная статья, дающая глубокое понимание Material Design для Android.

  • Анимируйте все. Переходы в Android

Узнайте, как создать прекрасные и выразительные анимации в своем Android-приложении, чтобы порадовать своих пользователей и сделать его выделяющимся среди остальных приложений.

  • Построение интерфейсов с помощью ConstraintLayout

Свежий ConstraintLayout полностью меняет приложение, когда дело доходит до разработки макетов для ваших приложений для Android. Эта статья поможет понять основы ConstraintLayout.

  • Восемь советов для вашего приложения с Material Design

Создавайте качественные приложения, не допуская распространенных ошибок, в то же время применяя Material Design.

  • Material Design is Design Science

Полезная статья, которая рассказывает, как наилучшим образом использовать Material Design при разработке своего приложения.


Бонус

Интересные ресурсы, которые нельзя пропустить.

  • Следите за разработчиками Android в Twitter

Если вы хотите быть в курсе последних событий разработки в мире Android, следите за передовыми разработчиками Android в Twitter.

  • Начните работу с Android Things Today!

Хотите погрузиться в мир IoT с помощью инструментов Android и его инфраструктуры? Вот хороший ресурс, чтобы начать это путешествие.

  • Знакомство с Android Wear

Если вы заинтересованы в разработке приложений для носимых устройств на Android, то вот исчерпывающий урок, который поможет вам начать разработку.

  • Ресурсы и атрибуты Android

Интересная статья о деталях повседневной работы с ресурсами и атрибутами в Android, которые могут быть вам неизвестны.

  • Введение в Android TV

Хотите разрабатывать приложения для телевизоров с большим экраном? Вот отличная статья, которая послужит хорошим введением в эту среду разработки


Полезные сайты

Хотите быть в курсе последних новостей в мире Android? Вот некоторые из лучших ресурсов для вас.

  • Android Weekly

Вы никогда не пропустите новости о развитии, статьи, видеоролики и другие события в мире Android.

  • Подкасты

Если вы любите слушать подкасты, то этот сайт для вас. Здесь можно обсуждать инструменты, шаблоны и лучшие практики. Вы наверняка не захотите пропустить двухнедельные эпизоды.

  • CodePath Android

Один из лучших и самых современных ресурсов с большим количеством пользователей для Android-разработчиков, где можно найти руководства и учебные пособия обо всех аспектах разработки. А главным плюсом является то, что он полностью открыт для вас, чтобы каждый мог внести свой вклад в развитие сообщества.

  • Скринкасты

Получайте высококачественные еженедельные скринкасты для Android с широким спектром тем для разработки.

  • Стили для Android

Ресурс, где вы найдете всю информацию, необходимую для проектирования пользовательского интерфейса и UX вашего приложения.

  • Официальный блог разработчиков Android

Это официальный блог, через который Google напрямую взаимодействует с разработчиками Android. Все последние новости и анонсы, связанные с разработкой, появляются здесь раньше, чем где-либо еще.

Мы надеемся, что эти ресурсы помогут вам узнать больше о разработке Android и создать более качественные приложения.

Перевод статьи «50+ Ultimate Resources to Master Android Development»

Понравилась статья? Поделить с друзьями:
  • Областной военкомат руководство
  • Скачать руководство по эксплуатации nissan march
  • Увлажнитель воздуха борк 701 инструкция по применению
  • Пандора сигнализация с автозапуском с телефона инструкция на русском
  • Омский завод транспортного машиностроения официальный сайт руководство