Когда надо создавать активити и когда надо использовать фрагменты? [дубликат]
Когда надо создавать активити и когда надо использовать фрагменты? Пример приложения: У меня будет карта с определениям место положения, перед этим я хочу сделать загрузочный экран пока карта погрузиться. После того как определиться адрес будет кнопка для оформления заказа (для этого будет форма). Затем можно будет видеть где передвигаеться машина с заказам. Также будет окно регистрации если пользователь не зарегистрирован. Как это все правильно организовать? Какой принцип построения окно должен быть? Хочу использовать Navigation Drawer Activity и не могу понять это надо создавать новый активити и около 5 xml файлов для каждого окна (настройки, форма заказа, регистрация, карта и т.д) или создать один активити на 10 окон и пытаться засунуть все в фрагмент.
Отслеживать
36.8k 6 6 золотых знаков 47 47 серебряных знаков 124 124 бронзовых знака
задан 15 апр 2016 в 9:06
498 6 6 серебряных знаков 17 17 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Что и как использовать выбирает программист в зависимости от задачи. Сделать приложение подобное вашему можно как из нескольких activity так и из одной activity и нескольких фрагментов.
Activity это сущность представляющая экран приложения. Их может быть несколько, и они могут меняться, передавать между собой данные. Экран приложения может содержать несколько типовых элементов (как пазл) и вот эти элементы удобнее сделать на основе фрагментов. На телефоне фрагмент может занимать весь экран, на планшете на экране может оказаться несколько фрагментов, что дает гибкость интерфейса.
Фрагменты по использованию ресурсов и удобству работы проще и легче activity. И по моему опыту организовывать навигацию и смену экранов с помощью фрагментов гораздо удобнее. При такой модели activity является контейнером, в котором отображаются и меняются несколько фрагментов.
Фрагменты не взаимодействуют друг с другом. Все взаимодействие осуществляется через activity. Механизмы взаимодействия могут быть разными. Лично мне удобнее обустраивать взаимодействие через интерфейсы. У меня обычно все механизмы взаимодействия прописываются как protected в наследованном от Fragment классе (можно назвать его BaseFragment или MyFragment или еще как-нибуть) и все остальные фрагменты приложения наследуются уже от него и используют эти механизмы взаимодействия как свои собственные без дублирования кода.
Отдельно стоит отметить, что существуют также другие точки зрения относительно Activity и фрагментов. Есть статьи в которых людей призывают использовать фрагменты как можно реже. Надо просто попробовать и то и другое и понять что удобнее лично для вас.
P.S. И я таки рекомендую прочитать вот это: Фрагменты
Activity (Активность, Деятельность)
Термин Activity еще не устоялся в русском языке у разработчиков. Некоторые используют слово Активность, другие — Деятельность. Чтобы не путаться в названиях, я буду использовать термин Активность (смотри примечание).
Разработчики со стажем могут воспринимать Активность как форму. Простые приложения состоят из одной активности. Более сложные приложения могут иметь несколько окон, т.е. они состоят из нескольких активностей, которыми надо уметь управлять и которые могут взаимодействовать между собой.
Активность, которая запускается первой, считается главной. Из нее можно запустить другую активность. Причем не только ту, которая относится к нашему приложению, но и другого приложения. Пользователю будет казаться, что все запускаемые им активности являются частями одного приложения, хотя на самом деле они могут быть определены в разных приложениях и работают в разных процессах. Попробуйте воспринимать активности как страницы разных сайтов, открываемых в браузерах по ссылке.
Примечание: Если у слова activity взять первые три символа и перемешать, то получим cat, впрочем из слова активность тоже можно получить кота.
Обычно активность занимает весь экран устройства, но это не является обязательным требованием. Вы можете создавать полупрозрачные и плавающие окна активностей. И с развитием Android такой подход набирает обороты.
Чтобы создать активность, нужно унаследоваться от класса Activity и вызвать метод onCreate(). В результате мы получим пустой экран. Толку от такого экрана никакого. Поэтому в активность добавляют компоненты, фрагменты с помощью разметки.
Жизненный цикл активности
Активность имеет жизненный цикл — начало, когда Android создает экземпляр активности, промежуточное состояние, и конец, когда экземпляр уничтожается системой и освобождает ресурсы. Активность может находиться в трех состояниях:
- активная (active или running) — активность находится на переднем плане экрана. Пользователь может взаимодействовать с активным окном;
- приостановленная (paused) — активность потеряла фокус, но все еще видима пользователю. То есть активность находится сверху и частично перекрывает данную активность. Приостановленная активность может быть уничтожена системой в критических ситуациях при нехватке памяти;
- остановленная (stopped) — если данная активность полностью закрыта другой активностью. Она больше не видима пользователю и может быть уничтожена системой, если память необходима для более важного процесса.
Если активность, которая была уничтожена системой, нужно снова показать на экране, она должна быть полностью перезапущена и восстановлена в своем предыдущем состоянии.
Активность в виде диалогового окна
Помните, изучая темы, мы создали вторую активность в виде диалогового окна. С таким же успехом вы можете создать окно и для основной активности. Добавим в манифесте для активности строчку:
Напишем код для запуска:
@Override public void onCreate(Bundle savedInstanceState)
Обратите внимание, что в данном примере мы не используем разметку, а программно создаём экземпляр класса TextView с необходимыми свойствами (текст, отступы) и передаём его в метод setContentView().
Програмнное создание активности
В основном мы пользуемся XML-разметкой для формирования внешнего вида активности. Это рекомендованный способ и в 99% вы будете использовать именно его. Но в некоторых случаях возможно вам понадобится создать активность программно. Сложного там ничего нет, для общего развития пригодится.
Если в стандартном случае мы подключаем XML-файл в методе setContentView(R.layout.activity_main), то при программном создании данный метод нам не понадобится. Удаляем его и пишем код:
package ru.alexanderklimov.test; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; public class TestActivity extends Activity < /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); // этот метод нам не нужен // setContentView(R.layout.activity_test); LinearLayout layout = new LinearLayout(TestActivity.this); layout.setId(R.id.layout_id); LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setLayoutParams(layoutParams); layout.setOrientation(LinearLayout.VERTICAL); ImageView imageView = new ImageView(TestActivity.this); imageView.setId(R.id.image_id); imageView.setImageResource(R.drawable.ic_launcher); LayoutParams imageViewLayoutParams = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); imageView.setLayoutParams(imageViewLayoutParams); layout.addView(imageView); setContentView(layout); layout.setOnClickListener(onViewClickListener); imageView.setOnClickListener(onViewClickListener); >OnClickListener onViewClickListener = new OnClickListener() < @Override public void onClick(View v) < int myId = v.getId(); Toast.makeText(TestActivity.this, "ID: " + String.valueOf(myId) + " clicked", Toast.LENGTH_LONG).show(); >>; >
Принцип формирования следующий — создаем объект LinearLayout (или другой контейнер) и настраиваем необходимые свойства. Далее создаём необходимые дочерние элементы и также настраиваем их свойства. Не забываем подключить дочерний элемент к родительскому через метод addView().
В данном примере мы также присваиваем компонентам идентификаторы через метод setId(), хотя необходимости в этом не было. В примере эта возможность показана для демонстрации. Если вы используете идентификаторы, то в файле res/values/stings.xml добавьте строчки:
Обычно опытные программисты создают отдельный файл для идентификаторов, например, res/values/ids.xml.
Классы Activity в Android
Android SDK включает набор классов, наследованных от Activity. Они предназначены для упрощения работы с виджетами, которые часто встречаются в обычном пользовательском интерфейсе. Перечислим некоторые из них (наиболее полезные).
- MapActivity. Инкапсулирует обработку ресурсов, необходимых для поддержки элемента MapView внутри Активности.
- ListActivity. Обертка для класса Activity, главная особенность которой — виджет ListView, привязанный к источнику данных, и обработчики, срабатывающие при выборе элемента из списка.
- ExpandableListActivity. То же самое, что и ListActivity, но вместо ListView поддерживает ExpandableListView.
- TabActivity. Позволяет разместить несколько Активностей или Представлений в рамках одного экрана, используя вкладки для переключения между элементами.
Activity: определение и его жизненный цикл в Android

Что такое жизненный цикл Activity? Для того чтобы попытаться ответить на этот вопрос, необходимо понимать , что такое Activity в Android , — тогда ответ на этот вопрос появится сам по себе.
Activity — это фундаментальный компонент каждого Android-приложения. Через этот компонент происходит взаимодействие между пользователем и приложением. При помощи него пользователь телефона может «путешествовать» между окнами приложения или между разными приложениями.
Фактическ и к омпонент Activity — это окно , которое открывается пользователю при запуске приложения. В этом компоненте создается интерфейс приложения, который виден пользователю со всеми кнопками, меню, формами и др. У одного Android-приложения может быть несколько окон Activity, н о о бычн о р еализуют только одно-единственное. При многокомпонентном Activity всегда определяют «главный экран», который запускается при активации приложения ; остальные экраны активируются по необходимости. Если провести аналоги ю с веб-сайтами, тогда можно сказать, что Activity в Андроид-приложениях — это главная страница на веб-сайтах, с которой посетитель сайта начинает знакомит ь ся с ресурсом.
Жизненный цикл Activity
Каждое запущенное Андроид-прило же ние имеет жизненный цикл, который ему определяет операционная система. Пр и активации приложени я о но получает самый высокий приоритет, а операционная система выделяет ему отдельный процесс. Именно поэтому ОС и может определять приоритетность приложений, потому что она контролирует процессы. «Приоритет» приложений означает, что активному приложению предоставляют максимальное количество ресурсов телефона, однако другие приложения также работают. Например, открыв любое приложение на телефоне, всегда можно принять звонок, получить SMS или получить сообщение в мессенджер е .
Поясняем , пр и ч ем здесь жизненный цикл Activity. Activity — это «экран взаимодействия» с приложением. Соответственно, если активно приложение, значит , будет актив на и Activity ; если нет — тогда нет. На практике это выглядит так : к огда запущено приложение, пользователь видит его Activity. Если запускается новое приложение, тогда его Activity выводится на экран, а старая «скрывается». Когда новая Activity прекращает работу, тогда она удаляется из стека, а старая Activity появляется на экране.
Жизненный цикл А ктивити связан с рядом событий, которые определяют его длительность.
Жизненный цикл А ктивити: события
- «onCreate()». Это первое событие, которое активируется при запуске приложения , и с него начинает свой жизненный цикл А ктивити. Он определяет первоначальную настройку «экрана», например, создает визуальные компоненты интерфейса приложения. После завершения работы этого состояни я п риложение переходит в следующее.
- «onStart()». Во время выполнения этого события приложение готовит ся показать Activity на экране устройства. После окончания этого событи я р абота приложения переходит к следующему событию.
- «onResume()». Это событие , во время которого Activity появляется на экране устройства и пользователь начинает взаимодействовать с интерфейсом приложения. Это «рабочее» состояние Activity, которое останется таким, пока пользователь взаимодействует с приложением и не закрывает его или не переходит в другое приложение.
- «onPause()». Это событие включается в том случае, если пользователь открыл другое приложение, не закрывая предыдущее. То ест ь п риложение не закрывается полностью, а лишь приостанавливает свою деятельность, чтобы освободить ресурсы телефона для работы другого приложения. Еще это состояние называют «фоновой» работой приложения. Приложение может оставаться в таком состоянии до тех пор , пока пользователь его не закроет или система сама его не закроет. Система может самостоятельно закрыть приложение в том случае, если им давно не пользовались, а в «фоне» работа е т слишком большое количество приложений и телефону не хватает ресурсов их поддерживать.
- «onStop()». Это событие , при котором Activity и приложение полностью останавливают свою работу и ее вообще не видно на экране. В о время этого события происходит полное высвобождение ресурсов телефона , о днако в памяти телефона во время этого события еще остаются настройки интерфейса. То есть, если во время этого события пользователь возобновит работу приложения, тогда на экране Activity отразятся настройки и работа пользователя с интерфейсом. К примеру, пользователь начал заполнять поля формы, но не закончил. Такие моменты пока еще сохраняются памяти. По окончани и этого события приложение переходит к следующему.
- «onDestroy()». Этим событием приложение завершает собственную деятельность. Оно возникает тогда, когда приложение было закрыто пользователем или операционной системой. Во время этого события высвобождаются все ресурсы системы, которые не были высвобождены в предыдущих этапах. Жизненный цикл Activity на этом этапе заканчивается.
Заключение
- пользователю поступил звонок на телефон , или он переключился на другое приложение, а в вашем случился сбой;
- пользователь не пользуется вашим приложением активно , а оно потребляет много ресурсов устройства;
- пользователь временно переключился на другое приложение, а по возвращени и все , что он делал в вашем приложении, удалилось;
- пользователь сменил положение экрана, а все , что он делал в вашем приложении , удалилось;
- и др.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Java. Как использовать переменные других Activity?
Пишу приложение под android. У меня есть 3 класса: MainActivity , SecondActivity , FinalActivity . В классе FinalActivity мне нужно использовать переменную firstVar из класса MainActivity и переменную secondVar из класса secondActivity. Напишите пожалуйста как мне это сделать.
Отслеживать
10.4k 3 3 золотых знака 12 12 серебряных знаков 34 34 бронзовых знака
задан 4 июн 2020 в 15:29
kirill_45030 kirill_45030
21 3 3 бронзовых знака
лучше передавать как параметр в другую активность (так и ищите информации полно)
4 июн 2020 в 16:26
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Что такое Activity? Activity это отдельный экран, с которым взаимодействует пользователь. Этот экран может вести на множество других экранов. На этот экран так же можно попасть с множества других мест.
Теперь представим ситуацию. У вас есть активити A и активити В. Флоу такой, пользователю показывается экран A и при нажатии на кнопку он попадает на экран В. Вы решили что в активити В нужна какая-то переменная из активити A. Вы сделали ее public, получили к ней доступ и успешно ее используете.
Через неделю к вам приходит заказчик и говорит, я хочу сделать deeplink который будет вести пользователя сразу на активити В, он там совершит какие-то действия и приложения закроется или пойдет по какому-то другому флоу. Вам придется подымать активити A для того чтоб работала активити В.
А потом этот же заказчик попросит вас вообще перенести кнопку перехода из активити A в активити В в активти С (С открывает В). И вам придется еще лезть в какие-то переменные и переносить их и изменять ваш код.
Вывод. Экраны должны быть максимально независимы друг от друга. В идеале они не должны знать ничего друг о друге, максимум это то как открыть другую активити. Все! Ни о каких методах или переменных они знать не должны!
Как быть если надо из активити A передать какие-то параметры в активити В? Решений много:
- синглтон который живет на протяжении всего приложения и никак не связан на жизненный цикл Активити.
- база данных. Активти A передает в активити В только id вашего объекта и активити В сама его открывает.
- Presenter-ы и ViewModel-и.
В общем любая другая сущность которая живет отдельно от активити и чья зона ответственности «Хранить данные»
