У меня есть сценарий, когда после входа в систему через страницу входа, будет выход button
на каждом activity
.
При нажатии sign-out
я передам session id
зарегистрированного пользователя для выхода. Кто-нибудь может подсказать мне, как оставаться session id
доступным для всех activities
?
Любая альтернатива этому делу
Ответы:
Самый простой способ сделать это - передать идентификатор сеанса в действие выхода из системы, которое
Intent
вы используете для запуска действия:Получите доступ к этому намерению в следующем упражнении:
В документах для намерений имеют больше информации (загляните в разделе под названием «Extras»).
источник
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
и в чем разница между этими двумя подходами? Какой лучше?В вашей текущей деятельности создайте новый
Intent
:Затем в новом действии извлеките эти значения:
Используйте эту технику для передачи переменных из одного занятия в другое.
источник
extras.getInt("new_variable_name")
. Если вы попытаетесь получить его черезgetString()
Android, посмотрите, что int был задан и возвращает ноль!startActivity(i);
? Я имею в виду, могу ли я выполнить операцию A, вызывать операцию B , и это возвращает данные в операцию A ? я в замешательстве?Прохождение Intent - хороший подход, как отметил Эрих.
Однако объект Application - это еще один способ, и иногда он проще при работе с одним и тем же состоянием в нескольких действиях (в отличие от необходимости получать / помещать его везде) или объектами, более сложными, чем примитивы и строки.
Вы можете расширить Application, а затем установить / получить все, что хотите, и получить к нему доступ из любого Activity (в том же приложении) с помощью getApplication () .
Также имейте в виду, что другие подходы, которые вы можете увидеть, такие как статика, могут быть проблематичными, поскольку они могут привести к утечкам памяти . Приложение помогает решить это тоже.
источник
Исходный класс:
Класс назначения (класс NewActivity):
источник
Вам просто нужно прислать дополнительные услуги, пока вы говорите о своем намерении.
Нравится:
Теперь по
OnCreate
вашему методуSecondActivity
вы можете получить такие дополнения.Если отправленное вами значение было в
long
:Если отправленное вами значение было
String
:Если отправленное вами значение было
Boolean
:источник
boolean
иlong
получателей, которые заслуживают комментария ИМО, а не ответа.Это помогает мне видеть вещи в контексте. Вот два примера.
Передача данных вперед
Основная деятельность
startActivity
.MainActivity.java
Вторая деятельность
getIntent()
чтобы получить,Intent
что началось второе действие. Затем вы можете извлечь данныеgetExtras()
и ключ, который вы определили в первом упражнении. Поскольку наши данные являются строкой, мы будем просто использоватьgetStringExtra
здесь.SecondActivity.java
Передача данных назад
Основная деятельность
startActivityForResult
, предоставив ему произвольный код результата.onActivityResult
. Это называется, когда заканчивается второе задание. Вы можете убедиться, что это фактически Второе действие, проверив код результата. (Это полезно, когда вы запускаете несколько разных действий из одного и того же основного действия.)Intent
. Данные извлекаются с использованием пары ключ-значение. Я мог бы использовать любую строку для ключа, но я буду использовать предопределенный,Intent.EXTRA_TEXT
так как я отправляю текст.MainActivity.java
Вторая деятельность
Intent
. Данные хранятся вIntent
паре ключ-значение. Я решил использоватьIntent.EXTRA_TEXT
для моего ключа.RESULT_OK
и добавьте намерение, содержащее ваши данные.finish()
чтобы закрыть Второе занятие.SecondActivity.java
источник
Обновлено примечание, что я упомянул использование SharedPreference . Он имеет простой API и доступен во всех приложениях. Но это неуклюжее решение и представляет угрозу безопасности, если вы передаете конфиденциальные данные. Лучше всего использовать намерения. Он содержит обширный список перегруженных методов, которые можно использовать для лучшей передачи разных типов данных между действиями. Посмотрите на intent.putExtra . Эта ссылка довольно хорошо описывает использование putExtra.
При передаче данных между действиями мой предпочтительный подход заключается в создании статического метода для соответствующего действия, включающего необходимые параметры запуска цели. Который затем обеспечивает легкую настройку и получение параметров. Так может выглядеть так
Затем вы можете создать намерение для планируемой деятельности и убедиться, что у вас есть все параметры. Вы можете адаптировать для фрагментов. Простой пример выше, но вы поняли идею.
источник
Попробуйте сделать следующее:
Создайте простой «вспомогательный» класс (фабрика для ваших намерений), например так:
Это будет фабрика для всех ваших намерений. Каждый раз, когда вам нужен новый Intent, создайте статический метод фабрики в IntentHelper. Чтобы создать новое намерение, вы должны просто сказать это так:
В вашей деятельности. Если вы хотите «сохранить» некоторые данные в «сеансе», просто используйте следующее:
И отправьте это намерение. В целевой деятельности ваше поле будет доступно как:
Так что теперь мы можем использовать Intent как тот же старый сеанс (как в сервлетах или JSP ).
источник
Вы также можете передать объекты пользовательского класса, создав класс, который можно передать . Лучший способ сделать его пригодным для продажи - написать свой класс, а затем просто вставить его на сайт, например http://www.parcelabler.com/ . Нажмите на сборку, и вы получите новый код. Скопируйте все это и замените оригинальное содержание класса. Затем-
и получить результат в NextActivity
Теперь вы можете просто использовать объект foo, как если бы вы использовали.
источник
Другой способ - использовать открытое статическое поле, в котором вы храните данные, а именно:
источник
Наиболее удобный способ передачи данных между действиями - передача намерений. В первом упражнении, из которого вы хотите отправить данные, вы должны добавить код,
Вы также должны импортировать
Затем в следующем Acitvity (SecondActivity) вы должны извлечь данные из намерения, используя следующий код.
источник
Вы можете использовать
SharedPreferences
...Логирование. ID сеанса хранения времени в
SharedPreferences
Выход. Время получения идентификатора сеанса в общих настройках
Если у вас нет требуемого идентификатора сеанса, удалите sharedpreferences:
Это очень полезно, потому что один раз вы сохраняете значение, а затем извлекаете в любом месте действия.
источник
Стандартный подход.
Теперь во втором упражнении извлеките данные из пакета:
Получить пакет
Извлечь данные ...
источник
i.putExtras()
/,getIntent().getString()
который предлагается 6 других ответов ...Из деятельности
К деятельности
источник
Bundle
основанный подход уже был предложен PRABEESH РК в 2012 году и Аджаем Венугопалом , Кришна . И может быть сведен кi.putExtras()
/,getIntent().getString()
который предлагается 8 других ответов ...Вы можете отправлять данные между действиями, используя объект намерения. Рассмотрим у вас есть два вида деятельности , а именно
FirstActivity
иSecondActivity
.Внутри FirstActivity:
Используя Намерение:
Inside SecondActivity
Теперь вы можете использовать разные методы класса комплекта для получения значений, переданных из FirstActivity по ключу.
Например
bundle.getString("key")
,bundle.getDouble("key")
иbundle.getInt("key")
т. Д.источник
Bundle
Основанный подход уже был предложен PRABEESH РК в 2012 году и Ajay Venugopal . И может быть сведен кi.putExtras()
/,getIntent().getString()
который предлагается 7 других ответов ...Если вы хотите перенести растровое изображение между Активами / Фрагментами
Деятельность
Чтобы передать растровое изображение между Activites
И в классе деятельности
Фрагмент
Чтобы передать растровое изображение между фрагментами
Получить внутри SecondFragment
Передача больших растровых изображений
Если вы получаете неудачную транзакцию связывания, это означает, что вы превышаете буфер транзакции связывания, перенося большой элемент из одного действия в другое.
Таким образом, в этом случае вы должны сжать растровое изображение как массив байтов, а затем распаковать его в другой деятельности , как это
В первую очередь
А во Второй деятельности
источник
Вы можете получить его в другой деятельности. Два пути:
Второй способ:
источник
Вот моя лучшая практика, и она очень помогает, когда проект огромен и сложен.
Предположим, что у меня есть 2 вида деятельности,
LoginActivity
иHomeActivity
. Я хочу передать 2 параметра (имя пользователя и пароль) изLoginActivity
вHomeActivity
.Во-первых, я создаю свой
HomeIntent
Вот как я передаю данные в моей LoginActivity
Последний шаг, вот как я получаю данные в
HomeActivity
Выполнено! Круто :) Я просто хочу поделиться своим опытом. Если вы работаете над небольшим проектом, это не должно быть большой проблемой. Но когда вы работаете над большим проектом, вам действительно больно, когда вы хотите провести рефакторинг или исправление ошибок.
источник
Дополнительный ответ: Соглашения об именах для ключевой строки
На фактический процесс передачи данных уже дан ответ, однако в большинстве ответов используются жестко закодированные строки для имени ключа в Intent. Это обычно хорошо, когда используется только в вашем приложении. Однако в документации рекомендуется использовать
EXTRA_*
константы для стандартизированных типов данных.Пример 1. Использование
Intent.EXTRA_*
ключейПервое занятие
Второе занятие:
Пример 2. Определение собственного
static final
ключаЕсли одна из
Intent.EXTRA_*
Строк не соответствует вашим потребностям, вы можете определить свою собственную в начале первого упражнения.Включение имени пакета - это просто соглашение, если вы используете ключ только в своем приложении. Но необходимо избегать конфликтов имен, если вы создаете какой-то сервис, который другие приложения могут вызывать с намерением.
Первое занятие:
Второе занятие:
Пример 3: Использование ключа ресурса String
Хотя это и не упомянуто в документации, этот ответ рекомендует использовать ресурс String, чтобы избежать зависимости между действиями.
strings.xml
Первое занятие
Второе занятие
источник
Ты можешь использовать
Intent
Другой способ может также использовать шаблон синглтона :
От вашей первой активности
На SecondActivity
источник
Передача данных между действиями происходит главным образом посредством намеренного объекта.
Сначала вы должны прикрепить данные к объекту намерения с использованием
Bundle
класса. Затем вызовите деятельность , используя либоstartActivity()
илиstartActivityForResult()
методов.Вы можете найти больше информации об этом, например, из сообщения в блоге. Передача данных в действие .
источник
Intent#putExtra()
). Но добавляет другоеBundle
и усложняет ситуацию.Вы можете попробовать Shared Preference, это может быть хорошей альтернативой для обмена данными между действиями
Сохранить идентификатор сессии -
Чтобы получить их -
источник
Запустите другое действие с помощью параметров передачи этого действия через Bundle Object
Получить другой вид деятельности (YourActivity)
Это нормально для простого типа данных. Но если вы хотите передать сложные данные между действиями, вам нужно сначала сериализовать их.
Здесь у нас есть модель сотрудника
Вы можете использовать Gson lib, предоставленный Google, для сериализации сложных данных, подобных этой
источник
Котлин
Проход от первого занятия
Получить во второй деятельности
Предложение
Всегда помещайте ключи в постоянный файл для более управляемого пути.
источник
источник
Чарли Коллинз дал мне идеальный ответ, используя
Application.class
. Я не знал, что мы могли бы подкласс это так легко. Вот упрощенный пример использования пользовательского класса приложения.AndroidManifest.xml
Присвойте
android:name
атрибуту собственный класс приложения.MyApplication.java
Используйте это как глобальный держатель ссылки. Он отлично работает в том же процессе.
MainActivity.java
Установите глобальную ссылку «singleton» на экземпляр приложения.
MyPreferences.java
Простой пример, где я использую основное действие из другого экземпляра действия.
источник
Недавно я выпустил Vapor API , фреймворк Android со вкусом jQuery, который упрощает все виды задач, подобных этой. Как уже упоминалось,
SharedPreferences
это один из способов, которым вы могли бы сделать это.VaporSharedPreferences
реализован как Singleton, так что это один из вариантов, и в Vapor API он имеет сильно перегруженный.put(...)
метод, поэтому вам не нужно явно беспокоиться о типе данных, который вы фиксируете - при условии, что он поддерживается. Это также свободно, так что вы можете звонить по цепочке:Он также может автоматически сохранять изменения и унифицировать процесс чтения и записи, поэтому вам не нужно явно извлекать редактор, как в стандартном Android.
В качестве альтернативы вы можете использовать
Intent
. В Vapor API вы также можете использовать цепной перегруженный.put(...)
метод дляVaporIntent
:И передайте это как дополнительное, как упомянуто в других ответах. Вы можете получить дополнительные данные от вашего
Activity
, и, более того, если вы используетеVaporActivity
это, это делается для вас автоматически, поэтому вы можете использовать:Чтобы получить их на другом конце в
Activity
вы переключитесь на.Надеюсь, что это представляет интерес для некоторых :)
источник
Первое занятие:
Второе занятие:
источник
Вы можете передавать данные между действиями в приложении тремя способами
Передача данных в намерениях имеет некоторые ограничения. Для большого объема данных вы можете использовать общий доступ к данным на уровне приложения, и, сохраняя его в SharedPreference, размер вашего приложения увеличивается
источник
Используйте глобальный класс:
Вы можете вызывать установщики и получатели этого класса из всех других классов. Для этого вам нужно создать объект GlobalClass в каждом акте:
Тогда вы можете позвонить, например:
источник