#android #android-intent #android-activity #bundle
#Android #android-намерение #android-активность #пакет
Вопрос:
В моем приложении я перехожу от MainActivity
к TrackingActivity
, а затем обратно MainActivity
. На этом последнем шаге я использую некоторые putExtra. Это мой код для возврата к MainActivity
:
public void goToHomeWithData(){
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("avgSpeed", avgSpeed);
intent.putExtra("totalDistance", totalDistance);
intent.putExtra("altitude", altitude);
intent.putExtra("totalTime", totalTime);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
}
В onResume()
методе в MainActivity
я хотел бы восстановить эти данные с помощью чего-то вроде:
String totalTime = getIntent().getExtras().getString("totalTime");
Double totalDistance = getIntent().getExtras().getDouble("totalDistance");
Double avgSpeed = getIntent().getExtras().getDouble("avgSpeed");
Double altitude = getIntent().getExtras().getDouble("altitude");
но поскольку onResume()
также вызывается при запуске приложения, приложение завершает работу со getIntent().getExtras().getString("totalTime");
стороны, поскольку не было намерения, которое вызывало MainActivity
.
То, что я ищу, — это проверка вокруг getIntent
s, чтобы узнать, MainActivity
вызывается ли он из TrackingActivity
или нет.
Заранее благодарю вас.
Ответ №1:
вы должны изучить startActivityForResu<
в действии 1
protected void launchSecondActivity() {
// TODO Auto-generated method stub
Intent i = new Intent(this,SecondActivity.class);
startActivityForResult(i, 0);
}
во втором действии вместо запуска нового экземпляра вашего первого действия используйте SetResult
public void goToHomeWithData(){
Intent intent = new Intent();
intent.putExtra("avgSpeed", avgSpeed);
intent.putExtra("totalDistance", totalDistance);
intent.putExtra("altitude", altitude);
intent.putExtra("totalTime", totalTime);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
setResult(RESULT_OK,intent);
finish();
}
затем в своем первом упражнении вы можете прослушать результат следующим образом:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK amp;amp; data!=null) {
if (data.getExtras().containsKey("SOMETAG") {
theExtraYouCareAbout = data.getStringExtra("SOMETAG");
}
}
обратите внимание, что это псевдокод, но он должен направить вас на правильный путь
Комментарии:
1. Возможно ли это без вызова
finish()
ingoToHomeWithData
? Я бы хотел оставить действие открытым, если это возможно.2. вы могли бы избавиться от finish() и вместо этого сказать onBackPressed() (при условии, что вы не вызываете finish() в onBackPressed() .. теперь важно понимать, что отправка вашей активности в фоновый режим без ее завершения не гарантирует, что она не будет уничтожена или не потеряет свои состояния ОС во время сборки мусора.. убедитесь, что вы связали свои состояния savedInstance
3. зачем вам нужно поддерживать его в рабочем состоянии?
4. потому что все приложение состоит всего из двух действий: webview на одном и Google map на втором. С этим не должно быть слишком сложно справиться, и мои данные GoogleMap, включая полилинии и другие, будут сохранены. onBackPressed() означает «при нажатии кнопки возврата»? Могу ли я вызвать это в своем коде?
5. да, это общедоступный метод, просто скажите ‘onBackPressed ();’ опять же, если вы собираетесь продолжать выполнять эти действия, убедитесь, что вы смотрите в savedInstanceStates просто на случай, если устройству пользователя необходимо освободить память developer.android.com/training/basics/activity-lifecycle /…