ActionBar up navigation воссоздает родительскую активность вместо onResume

Я использую рекомендуемый подход для Up Navigation, и мой код выглядит так:

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent h = new Intent(ShowDetailsActivity.this, MainActivity.class); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(h); return true; default: return super.onOptionsItemSelected(item); } } 

Вот прецедент:

  1. Я запускаю свое приложение, которое является «MainActivity»
  2. Я нажимаю кнопку, чтобы перейти к "ShowDetailsActivity"
  3. Я нажимаю на навигацию UP ActionBar

Проблема заключается в том, что после того, как я нажимаю UP, MainActivity снова и снова использует методы onCreate () и теряет все состояние, а не начинает с типичного onResume (), как если бы я только что вызвал «finish ()» из ShowDetailsActivity. Зачем? Это то, как это всегда работает, и ожидается, что поведение Android будет воссоздавать все действия, которые ориентированы на использование подхода «Вверх»? Если я нажму кнопку «Назад», я получу ожидаемый жизненный цикл onResume.

Это мое решение, если Android «правильных» не существует:

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = new Intent(this, MainActivity.class); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { NavUtils.navigateUpTo(this, upIntent); finish(); } else { finish(); } return true; default: return super.onOptionsItemSelected(item); } } 

Solutions Collecting From Web of "ActionBar up navigation воссоздает родительскую активность вместо onResume"

Добавьте в файл манифеста следующее родительское действие

 android:launchMode="singleTop" 

Относительно этого ответа

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

«Система всегда создает новый экземпляр действия в целевой задаче»

И, следовательно, активность воссоздается (см. Документ здесь ).

Решение заключалось бы в том, чтобы объявить режим запуска MainActivity как

 android:launchMode="singleTop" 

В AndroidManifest.xml
(Всегда должен работать вместе с Intent.FLAG_ACTIVITY_CLEAR_TOP )

Или вы можете добавить FLAG_ACTIVITY_SINGLE_TOP в свои флаги намерений, чтобы сообщить активности, что его нельзя воссоздавать, если он находится на заднем стеке, например

 Intent h = NavUtils.getParentActivityIntent(this); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); NavUtils.navigateUpTo(this, h); 

Этот код работал для меня:

 Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is NOT part of this app's task, so create a new task // when navigating up, with a synthesized back stack. TaskStackBuilder.create(this) // Add all of this activity's parents to the back stack .addNextIntentWithParentStack(upIntent) // Navigate up to the closest parent .startActivities(); } else { // This activity is part of this app's task, so simply // navigate up to the logical parent activity. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; 

Не требуется выполнить вызов finish ().

Вам просто нужно вернуться, чтобы не создавать активность снова.

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); } 

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

 Intent upIntent = NavUtils.getParentActivityIntent(this); upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(upIntent); finish(); return true; 

Начиная с Android 4.1 (API-уровень 16), вы можете объявить логического родителя каждого действия, указав в элементе атрибут android: parentActivityName. Если ваше приложение поддерживает Android 4.0 и ниже, включите библиотеку поддержки в приложение и добавьте элемент внутри. Затем укажите родительскую активность как значение для android.support.PARENT_ACTIVITY, соответствующее атрибуту android: parentActivityName.

 <application ... > ... <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.myfirstapp.MainActivity" ...> ... </activity> <!-- A child of the main activity --> <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

Если родительская активность имеет режим запуска или намерение вверх содержит FLAG_ACTIVITY_CLEAR_TOP, родительская активность переносится в верхнюю часть стека и получает намерение посредством метода onNewIntent ().

 <activity android:launchMode="singleTop" android:name="com.example.myfirstapp.MainActivity"> </activity> 

В вышеприведенном коде «SingleTop» может быть создан новый экземпляр действия «singleTop» для обработки нового намерения. Однако, если целевая задача уже имеет существующий экземпляр активности в верхней части стека, этот экземпляр получит новое намерение (в вызове onNewIntent ()); Новый экземпляр не создается.

Для подробной документации Нажмите здесь

Чтобы перейти вверх, когда пользователь нажимает значок приложения, вы можете использовать статический метод класса NavUtils, navigateUpFromSameTask (). Для ознакомления с документом, приведенным в ссылке выше.