Как передать значения между действиями на Android?
Это навигация моего приложения:
Activity1
вызывает Activity2
→ Activity2.finish()
, вызов Activity3
→ Activity3.finish()
Когда Activity3
заканчивается, он вызывает метод onResume
Activity1
. Теперь как передать значение от Activity3
до Activity1
?
Ответы
Ответ 1
Umesh показывает хорошую технику, но я думаю, что вы хотите противоположное направление.
Шаг 1
При запуске действий 2 и 3 используйте startActivityForResult
. Это позволяет обрабатывать результат в вызывающей активности.
startActivityForResult(MY_REQUEST_ID);
Шаг 2
В действиях 2 и 3 вызовите setResult(int, Intent)
, чтобы вернуть значение:
Intent resultData = new Intent();
resultData.putExtra("valueName", "valueData");
setResult(Activity.RESULT_OK, resultData);
finish();
Шаг 3
В вашей активизации вызова выполните onActivityResult
и получите данные:
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == MY_REQUEST_ID) {
if (resultCode == RESULT_OK) {
String myValue = data.getStringExtra("valueName");
// use 'myValue' return value here
}
}
}
Edit:
Техника № 2
Да, вы также можете использовать глобальное состояние приложения, добавив класс в ваше приложение, которое расширяет Application
, см. этот ответ StackOverflow
Ответ 2
Используйте идентификатор сеанса для активности выписки в намерении, которое вы используете для запуска активности:
Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent)
Смотрите учебник.
Ответ 3
Зачем даже беспокоиться о такой структуре... если три возвращаются к одному? Просто отправьте намерение с вашими данными от трех до одного и обработайте его соответствующим образом.
Ответ 4
Отправка намерения с 3-й по 1-й операции потребует некоторого триггера, например, кнопки или, возможно, метода жизненного цикла onStop для его отправки. Лучше автоматически отправить результат с помощью метода setResult.
Ответ 5
Также существует другая методика, вы можете вызвать метод startActivity(new Intent(getApplicationContext(),Activity1.class))
вместе с классом Bundle для переноса данных из activity3 в activity1.
Ответ 6
В Android можно запустить другое приложение с указанным именем пакета, передав ему аргумент.
public static void launchApp(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if(intent == null) {
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName));
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(Intent.EXTRA_TEXT, "*argument to send*");
context.startActivity(intent);
}
Код ниже может использоваться для извлечения аргумента в целевом приложении.
public static String getArgument(Activity activity) {
return activity.getIntent().getStringExtra(Intent.EXTRA_TEXT);
}
Требуется только ссылка на Activity, это полезно в Unity, где она беспорядочна для подкласса Activity.