Как обновить activity android studio

Как обновить activity android studio

Может случиться такая ситуация, когда вам нужно обновить все данные в компонентах Activity, но Вы прописали такую сложную логику, что уже не в силах разобраться, где что и как обновлять. Но вы знаете точно, что инициализация всего содержимого с новыми параметрами конструкторов по новой точно приведет к нужному результату.
Так вот. Быстрое решение — заново перезапустить вашу Activity (при условии, что она не держит какие-то важные «рабочие» потоки)!
Решение, подсмотренное на ресурсе stackoverflow.com
Конечно же, не рекомендуется постоянно вести такую практику. Акция скоре одноразовая, желательно, чтобы вы заменили это другим кодом, а вашу архитектуру пересмотрели и переписали как более понятную и чистую.

Итак, быстрый и малозатратный по ресурсам устройства способ перезапуска Activity:

private void reload(int x, . ВАШИ ПАРАМЕТРЫ)
<
Intent intent = getIntent();
intent.putExtra(Работаем с объектом Intent);//1
intent.putExtra(Работаем с объектом Intent);//2
intent.putExtra(Работаем с объектом Intent);//3
overridePendingTransition(0, 0);//4
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);//5
finish();//6
overridePendingTransition(0, 0);//7
startActivity(intent);//8
>

Комментарии к коду:
В 1-3 строчках (пронумерованы условно в теле метода) мы работаем с объектом Intent, который запустит наш новый экземпляр такой же Activity. Строки 4-7 убирают всяческие переходы, анимацию и красоту. Таким образом, для пользователя будет отображаться как бы старая форма, что и была, но данные в ней будут новые! Никаких переходов, анимаций, перекидываний, вычислительные ресурсы на это не тратятся. Чудесно.
Вызываем данный метод из Activity, когда желаем обновиться.

Источник

Что такое Activity и его жизненный цикл в Android

Russian (Pусский) translation by Ellen Nelson (you can also view the original English article)

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

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

Жизненный цикл Activity

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

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

Методы жизненного цикла

Давайте поближе рассмотрим жизненный цикл Android Activity. Каждый раз, когда Activity меняет стадию, вызывается один из следующих методов жизненного цикла для класса Activity.

onCreate() : вызывается при первой инициализации Activity. Вам нужно выполнить этот метод для выполнения любой инициализации в вашей Activity.

onStart() : это вызывается, когда Activity готова и отображается пользователю в первый раз, так как Activity готовится стать интерактивной и выйти на передний план. После завершения вызова этого метода, будет вызван метод onResume() .

onResume() : когда Activity переходит в это состояние, оно начинает взаимодействовать с пользователем. Activity продолжает работать в этом состоянии, пока что-либо не уведёт фокус от приложения или Activity (например, входящий звонок). Если это произойдет, будет вызван метод onPause() .

onPause() : этот метод используется для приостановки действий, которые не должны происходить, пока Activity в стадии паузы. Вызов этого метода указывает на то, что пользователь покинул приложение. К примеру, входящий звонок может перевести, проигрыватель музыки в состояние паузы. Это должно заглушить или остановить воспроизводящуюся музыку. Когда пользователь возвращается в приложение, вызывается метод onResume() .

onStop() : этот метод вызывается, если Activity больше не видна в приложении. Такое может случится, если подгружена другая Activity и она занимает весь экран устройства. Когда вызывает этот метод, Activity сообщается перейти в состояние прекращения работы. В этом состоянии, система либо вызывает onRestart() для возврата взаимодействия с Activity, либо вызывает метод onDestroy() , чтобу убрать Activity.

onDestroy() : этот метод вызывается перед тем, как Activity будет завершена. Система вызывает этот метод, когда пользователь завершает Activity, или если система временно убирает процесс, содержащий Activity, для высвобождения места. С этом методом, обязательно освободите любые ресурсы, созданные вашей Activity, иначе ваше приложение будет иметь утечку памяти.

Читайте также:  Обновления по для андроид нужно ли обновлять

onRestart() : это вызывается, если Activity перезапускается, после того, как было остановлено.

Запуск Activity

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

Необходимо связывать Activity друг с другом, если требуется чтобы одна Activity запускала другую. Для запуска Activity используйте либо startActivity() , либо startActivityForResult() . В обоих случаях вы должны передать Intent.

Запуск Activity без ожидаемого результата

startActivity() используется, если недавно запущенная Activity не должна возвращать результат.

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

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

Запуск Activity на результат

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

Вы получите результат от Activity в методе onActivityResult(int requestCode, int resultCode, Intent data) . Результат будет возвращен в качестве Intent.

Пример запуска Activity

Вот пример, который показывает как работает запуск Activity

Во-первых создайте MainActivity с вашим методом onCreate() , файл макета и кодом запроса.

В методе onCreate() вы создадите новый экземпляр намерения (intent) чтобы запустить вторую Activity.

Когда будете готовы к запуску Activity, скажем в ответ на нажатие кнопки, вы вызовете startActivityForResult() , которая передаст свеже-созданное намерение и код запроса.

В вашей MainActivity , вам всё же нужно обработать результат событий Activity. Это выполняется путём реализации метода onActivityResult() . Вот так вы и получите результат от другой Activity.

Вот как это должно выглядеть:

Теперь создайте вашу SecondActivity . Это должно быть похоже на код ниже.

Прерывание Activity

Перед завершением Activity, будут вызваны соответствующие методы жизненного цикла.

Метод onPause() должен остановить все «слушания» и обновления интерфейса. Метод onStop() должен сохранять данные приложения. И наконец, метод onDestroy() высвободит любые ресурсы, выделенные для Activity.

Когда пользователь переключается обратно на приложение, которое было прервано системным событием, вызывается метод onResume() . На основе сохраненных данных, могут перерегистрироваться «слушатели» и переключиться обновления интерфейса.

Стадия экземпляра Activity

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

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

Чтобы сохранить состояние Activity, можно переопределить метод onSaveInstanceState(). Этот метод передаёт объект Bundle , в качестве параметра. Пакет (bundle) может содержать строки, простые типы данных или объекты. В этом методе, просто добавьте любые данные о важном состоянии в пакет (bundle). Позже этот пакет вернется Activity, так что вы сможете восстановить состояние Activity.

Чтобы извлечь сохраненное состояние из пакета и восстановить его (состояние), примените метод onRestoreInstanceState() . Этот callback вызывается между методами жизненного цикла onStart() и onResume() .

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

Заключение

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

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

Источник

Обновление данных в activity

Всем доброй ночи!
Как обновить данные в активити при возврате из диалога или из другой активити, т.е. когда фокус возвращается на активити?
Блин, запутанно получилось.
Вообщем, есть код, который выполняет обновление представления, выполняет поиск данных и обновляет ViewPager, куда его поместить, чтобы это происходило каждый раз, когда активити становиться активной вновь: закрытие диалога, подтверждение в диалоге с последующим закрытием, нажатие кнопки «назад» или в ActionBar, возвращающее на данную активити из другой. Вообщем при каждом возврате фокуса к данной активити.

Обновление данных Activity при нажатии на кнопку
Приветствую всех. Проблема такая: необходимо обновлять данные(ImageView, TextView и т.п.) в.

Читайте также:  Adding the actionbar android

Android — Передача данных с одного Activity на другое Activity
Здравствуйте , возникла необходимость получения числовых (int и float ну или double) данных в одном.

Как изменить кнопку на втором Activity с первого Activity в Android Studio?
Общая задача сделать уровни для игры, по окончанию первого уровня, появляется кнопка «выбор уровня».

Как в Android Studio изменять объект одного Activity из другого Activity?
Есть два Activity, в одном кнопка и элемент editText. Во втором activity есть элемент TextView.

Но при закрытии диалога эти события не возникают.

Источник

Асинхронные операции и пересоздание Activity в Android

В одной статье на хабре (274635) было продемонстрировано любопытное решение для передачи объекта из onSaveInstanceState в onRestoreInstanceState без сериализации. Там используется метод writeStrongBinder(IBInder) класса android.os.Parcel .

Такое решение корректно функционирует до тех пор, пока Android не выгрузит ваше приложение. А он вправе это сделать.

Однако это не главное. (Если приложению не нужно восстанавливать свое состояние после такого рестарта, то подойдет и это решение).

А вот цель, для чего там используются такие «несериализуемые» объекты мне показалась странной. Там через них передаются вызовы из асинхронных операций в Activity , чтобы обновить отображаемое состояние приложения.

Я всегда думал, что со времен Smalltalk, любой разработчик распознает эту типовую задачу проектирования. Но кажется я оказался не прав.

Задача

  • По команде от пользователя ( onClick() ) запустить асинхронную операцию
  • По завершению операции отобразить результат в Activity

Особенности

  • Activity , отображаемая в момент завершения операции, может оказаться
    • та же, из которой поступила команда
    • другим экземпляром того же класса (поворот экрана)
    • экземпляром другого класса (пользователь перешел на другой экран в приложении)

  • На момент завершения операции может оказаться, что ни одна Activty из приложения не отображается

В последнем случае результаты должны отображаться при следующем открытии Activity .

Решение

MVC (с активной моделью) и Layers.

Подробное решение

Вся остальная часть статьи — это объяснение что такое MVC и Layers.

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

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

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

Построить такое приложение можно из несложных компонентов. Например:

  1. Компонент где будет находиться билет ( TicketSubsystem )
  2. TicketActivity где будет отображаться билет и кнопка «Взять билет»
  3. Класс для Билета (номер билета, позиция в очереди, номер окошка)
  4. Класс для Асинхронной операции получения билета

Самое интересное то, как эти компоненты взаимодействуют.

Приложение вовсе не обязано содержать компонент TicketSubsystem . Билет мог бы находиться
в статическом поле Ticket.currentTicket , или в поле в классе-наследнике android.app.Application .
Однако очень важно, чтобы состояние есть/нет билета исходило из объекта способного выполнять роль
Модель из MVC — т. е. генерировать уведомления при появлении (или замене) билета.

Если сделать TicketSubsystem моделью в терминах MVC , то Activity сможет подписаться на события и обновить отображение билета когда тот будет загружен. В этом случае Activity будет выполнять роль View ( Представление ) в терминах MVC .

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

Модель

Очевидно, что моделью должен являться билет. Однако в приложении билет не может «висеть» в воздухе. Кроме того, билет изначально не существует, он появляется только по завершению асинхронной операции. Из этого следует, что в приложении должно быть еще что-то где будет находиться билет. Пусть это будет TicketSubsystem . Сам билет также должен быть как-то представлен, пусть это будет класс Ticket . Оба этих класса должны быть способны выполнять роль активной модели.

Способы построения активной модели

Активная модель — модель оповещает представление о том, что в ней произошли изменения. wikipedia

В java есть несколько вспомогательных классов для создания активной модели. Вот например:

  1. PropertyChangeSupport и PropertyChangeListener из пакета java.beans
  2. Observable и Observer из пакета java.util
  3. BaseObservable и Observable.OnPropertyChangedCallback из android.databinding

Мне лично нравится третий способ. Он поддерживает строгое именование наблюдаемых полей, благодаря аннотации android.databinding.Bindable . Но есть и другие способы, и все они подходят.

А в Groovy есть замечательная аннотация groovy.beans.Bindable. Вместе с возможностью краткого объявления свойств объекта получается очень лаконичный код (который опирается на PropertyChangeSupport из java.beans ).

Представление

TicketActivity (как практически все объекты относящиеся к представлению) появляется и исчезает по воле пользователя. Приложение всего лишь должно корректно отображать данные в момент появления Activity и при изменении данных пока отображается Activity .

Итак в TicketActivity нужно:

  1. Обновлять UI виджеты при изменении данных в ticket
  2. Подключать слушателя к Ticket когда он появится
  3. Подключать слушателя к TicketSubsytem (чтобы обновить вид, когда появится ticket )

1. Обновление UI виджетов.

В примерах в статье я буду использовать PropertyChangeListener из java.beans ради демонстрации
подробностей. А в исходном коде по ссылке внизу статьи будет использоваться библиотека android.databinding ,
как обеспечивающая самый лаконичный код.

2. Подключение слушателя к ticket

Метод setTicket при замене билета удаляет подписку на события от старого билета и подписывается на события от нового билета. Если вызывать setTicket(null) , то TicketActivity отпишется от событий ticket .

3. Подключение слушателя к TicketSubsystem

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

Асинхронная операция «Взять билет»

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

Здесь ссылка globalTicketSubsystem (она также упоминалась в TicketActivity ) зависит от способа компоновки подсистем в вашем приложении.

Восстановление состояния при рестарте

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

И вот наше приложение должно отобразить билет полученный до рестарта.

Чтобы обеспечить эту функциональность я буду записывать билет в файл и считывать его после старта приложения.

Layers

Этот шаблон определяет правила по которым одним классам позволяется зависеть от других классов, так чтобы не возникало чрезмерной запутанности кода. Вообще это семейство шаблонов, а я ориентируюсь на вариант Крейга Лармана из книги «Применение UML и шаблонов проектирования». Вот здесь есть диаграмма.

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

Обратите внимание, что все стрелочки, что пересекают границы уровней, направлены строго вниз! TicketActivity создает GetNewTicket — стрелка вниз. GetNewTicket создает Ticket — стрелка вниз. Анонимный ticketListener реализует интерфейс PropertyChangeListener — стрелка вниз. Ticket оповещает слушателей PropertyChangeListener — стрелка вниз. И т. д.

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

Еще капельку теории, и перейдем к коду.

Назначение уровней

Объекты на уровне Domains отражают бизнес-сущности с которыми работает приложение. Они должны быть независимы от того как устроено наше приложение. Например наличие поля positionInQueue у Ticket обусловлено бизнес требованиями (а не тем, как мы написали наше приложение).

Уровень Application — это граница того, где может располагаться логика приложения (кроме формирования внешнего вида). Если нужно сделать какую-то полезную работу, то код должен оказаться здесь (или ниже).

Если нужно сделать что-то обладающее внешним видом, то это класс для уровня Presentation . А значит этот класс может содержать только код отображения, и никакой логики. За логикой ему придется обращаться к классам с уровня Application .

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

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

Эвристика

  1. Если приложению удалить Уровень Представления, то оно должно быть в состоянии выполнить все свои функции (кроме демонстрации результатов). Наше приложение без Уровня Представления всё ещё будет содержать и код для запроса билета, и сам билет, и доступ к нему.
  2. Если объект какого-то класса что-то отображает, или реагирует на действия пользователя, то его место на Уровне Представления.
  3. В случае противоречий — разделяйте класс на несколько.

Источник

Читайте также:  Wallpaper from android phone
Оцените статью