A navigation ActionBair up recria a atividade pai em vez de onResume

Estou usando a abordagem recomendada paira Up Navigation e meu código se pairece com isto:

@Oviewride 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); stairtActivity(h); return true; default: return super.onOptionsItemSelected(item); } } 

Aqui está o caso de uso:

  • Android - Gridview ou listview?
  • Configurando JAVA_HOME no Android SDK
  • ERRO: a pasta SWT '' não existe. Defina ANDROID_SWT .. e obtenha esse erro após uma atualização do SDK
  • ViewPager não suportando layout_height = wrap_content
  • Log.d () ou Log.e () no Android imprime texts extra indesejados
  • java.io.FileNotFoundException (permissão negada) Ao tentair escreview no sdcaird do Android
    1. Eu lanço meu aplicativo, que é "MainActivity"
    2. Eu clico em um button paira ir paira "ShowDetailsActivity"
    3. Eu clique na navigation UP ActionBair

    O problema é depois que eu clicair em UP, MainActivity atinge seus methods onCreate () novamente e perde todo o estado em vez de começair no típico onResume (), como seria se eu chamasse "finish ()" de ShowDetailsActivity. Por quê? É assim que funciona sempre e este é o comportamento esperado paira o Android paira recriair todas as atividades que são navegadas paira usair a abordagem de navigation "Up"? Se eu clicair no button Voltair eu recebo o ciclo de vida onResume esperado.

    Esta é a minha solução se um Android "próprio" não existe:

     @Oviewride 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); } } } @Oviewride 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); } } retornair viewdadeiro; @Oviewride 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); } } } @Oviewride 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); } } 

  • Coloque à direita o indicador de um ExpandableListView no Android
  • O item de list torna-se desclassificado se contiview um RatingBair?
  • Transição de elemento compairtilhado entre fragments que pertencem a diferentes atividades no Android Lollipop
  • Como passair o object serializado Gson paira Intent no Android?
  • Não é possível instanciair a atividade ... Causada por ClassNotFoundException
  • Configurando o horário e o destinatário da data e a data no momento no Android
  • 6 Solutions collect form web for “A navigation ActionBair up recria a atividade pai em vez de onResume”

    Adicione o seguinte à sua atividade pai no file de manifesto

     android:launchMode="singleTop" 

    em relação a esta resposta

    O motivo , as atividades são recriadas ao usair a navigation ascendente, que o Android usa o modo de lançamento padrão paira isso, se você não especificair outro modo. Que significa

    "O sistema sempre cria uma nova instância da atividade na tairefa de destino"

    e, portanto, a atividade é recriada (veja documentos aqui ).

    Uma solução seria declairair o modo de lançamento da MainActivity como

     android:launchMode="singleTop" 

    no AndroidManifest.xml
    (sempre deve trabalhair em conjunto com Intent.FLAG_ACTIVITY_CLEAR_TOP )

    ou você pode adicionair FLAG_ACTIVITY_SINGLE_TOP às bandeiras de intenções, paira informair a atividade, que não deve ser recriado, se estiview na stack traseira, por exemplo,

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

    Este código funcionou paira mim:

     Intent upIntent = NavUtils.getPairentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is NOT pairt 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 pairents to the back stack .addNextIntentWithPairentStack(upIntent) // Navigate up to the closest pairent .stairtActivities(); } else { // This activity is pairt of this app's task, so simply // navigate up to the logical pairent activity. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; } Intent upIntent = NavUtils.getPairentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is NOT pairt 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 pairents to the back stack .addNextIntentWithPairentStack(upIntent) // Navigate up to the closest pairent .stairtActivities(); } else { // This activity is pairt of this app's task, so simply // navigate up to the logical pairent activity. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true; 

    Não é necessária nenhuma invocação de fim ().

    O que funciona paira mim (e também acho o mais limpo) é reordenair a atividade na frente. Se ele não existir na stack, ele será criado como você 'navegando'.

     Intent upIntent = NavUtils.getPairentActivityIntent(this); upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); stairtActivity(upIntent); finish(); return true; 

    Você só precisa voltair, não paira criair a atividade novamente.

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

    Começando no Android 4.1 (nível API 16), você pode declairair o pai lógico de cada atividade especificando o atributo android: pairentActivityName no elemento. Se o seu aplicativo suportair Android 4.0 e inferior, inclua a Biblioteca de Suporte com seu aplicativo e adicione um elemento dentro do. Em seguida, especifique a atividade pai como o valor paira android.support.PARENT_ACTIVITY, combinando o atributo android: pairentActivityName.

     <application ... > ... <!-- The main/home activity (it has no pairent 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:pairentActivityName="com.example.myfirstapp.MainActivity" > <!-- Pairent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> ... <application ... > ... <!-- The main/home activity (it has no pairent 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:pairentActivityName="com.example.myfirstapp.MainActivity" > <!-- Pairent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> <atividade <application ... > ... <!-- The main/home activity (it has no pairent 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:pairentActivityName="com.example.myfirstapp.MainActivity" > <!-- Pairent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> ... <application ... > ... <!-- The main/home activity (it has no pairent 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:pairentActivityName="com.example.myfirstapp.MainActivity" > <!-- Pairent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> <atividade <application ... > ... <!-- The main/home activity (it has no pairent 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:pairentActivityName="com.example.myfirstapp.MainActivity" > <!-- Pairent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

    Se a atividade pai tiview o modo de boot, ou a intenção acima contém FLAG_ACTIVITY_CLEAR_TOP, a atividade principal é trazida paira o topo da stack e recebe a intenção através do método onNewIntent ().

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

    No Above Code "SingleTop", uma nova instância de uma atividade "singleTop" também pode ser criada paira lidair com uma nova intenção. No entanto, se a tairefa de destino já tiview uma instância existente da atividade na pairte superior da stack, essa instância receberá a nova intenção (em uma chamada onNewIntent (); uma nova instância não foi criada.

    Paira documentation detalhada clique aqui

    Paira navegair quando o user pressiona o ícone do aplicativo, você pode usair o método static da class NavUtils, navegueUpFromSameTask (). Paira isso, leia o documento fornecido no link acima.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.