Como posso voltar a uma atividade paterna corretamente?

tenho 2 actividades (A E B) na minha aplicação android e uso uma intenção de passar da actividade A à actividade B. O uso de parent_activity está activo:

 <activity
        android:name=".B"
        android:label="B" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
  </activity>

eu também uso um tema que fornece um botão de UP.

O problema é que a aplicação parece chamar a onCreate () - função da actividade a novamente e este não é o comportamento que eu preciso. Preciso de actividade A para ver. da mesma forma que parecia antes de ligar para a actividade B.

Há alguma maneira de conseguir isso?

obrigado antecipadamente

editar:

Não escrevi nenhum código para iniciar a actividade B da actividade A. Acho que é autogenerada pelo eclipse.

A Classe B parece:

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
Author: ashiaka, 2012-09-05

16 answers

Declarou actividade A com o padrão no manifesto Android. De acordo com a documentação significa o seguinte:

O sistema cria sempre uma nova instância da actividade no alvo tarefa e encaminha a intenção para ela.

Portanto, o sistema é forçado a recriar a actividade A (isto é, chamando onCreate) Mesmo que a pilha de tarefas seja tratada correctamente.

Para resolver este problema, é necessário alterar o manifesto, adicionando o seguinte atributo da declaração de actividade A:

android:launchMode="singleTop"

Nota: chamada finish() (como sugerido como solução antes) funciona apenas quando você estiver completamente certo em que a atividade B instância que você está terminando vive em cima de uma instância de atividade A. Em workflows mais complexos (por exemplo, o lançamento de atividade de B a partir de uma notificação) este pode não ser o caso e você tem que iniciar corretamente A atividade A partir de B.

 310
Author: LorenzCK, 2014-12-26 13:45:59

Resposta Actualizada: Up Design De Navegação

Tem de declarar qual a actividade que é o progenitor apropriado para cada actividade. Ao fazê-lo, permite que o sistema para facilitar os padrões de navegação, como Up, porque o sistema pode determinar a atividade lógica pai a partir do arquivo manifesto.

Por isso, para isso, tem de declarar a sua actividade-mãe na actividade das marcas com o atributo

android:parentActivityName

Tipo,

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

Com a actividade parental declarado desta forma, você pode navegar até o pai apropriado como abaixo,

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Por isso, ao ligar para NavUtils.navigateUpFromSameTask(this); este método, termina a actividade actual e inicia (ou retoma) a actividade-mãe apropriada. Se a actividade-mãe do alvo estiver na pilha de trás da tarefa, ela é antecipada de acordo com a definição de FLAG_ACTIVITY_CLEAR_TOP.

E para mostrar o botão você tem que declarar setDisplayHomeAsUpEnabled():

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

Resposta antiga: (Sem Navegação Up, navegação Back predefinida)

It só pode repetir a actividade A A a partir da actividade B.

Usando startActivity().

Em vez disto, a partir da actividade a iniciar a actividade B usando startActivityForResult() e anular onActivtyResult() na actividade A.

Agora na actividade B, basta ligar o botão para cima. Então agora você direcionou para a atividade a [[11]] sem criar a atividade a novamente..
 72
Author: user370305, 2014-03-26 07:36:27
Eu tinha praticamente a mesma configuração, levando ao mesmo comportamento indesejado. Para mim, isto funcionou.: adicionar o seguinte atributo a uma actividade a no Manifest.xml da minha aplicação:
android:launchMode="singleTask"

Ver este artigo para mais explicações.

 22
Author: androidnewbie, 2018-08-14 22:24:06

Embora uma pergunta antiga, aqui está outra (imho a solução mais limpa e melhor) já que todas as respostas anteriores não funcionaram para mim desde que eu actividade de ligação profunda B de um Widget .

public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
    Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
  } else {
    NavUtils.navigateUpTo(this, upIntent);
  }
}

[https://stackoverflow.com/a/31350642/570168 ]

Mas também ver: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

 15
Author: Lord Flash, 2017-05-23 12:18:26
A melhor maneira de o conseguir é usando duas coisas.: Chamada:
NavUtils.navigateUpFromSameTask(this);
Agora, para que isto funcione, tens de ter o teu ficheiro manifesto a dizer que a actividade A tem uma actividade parental B. A actividade parental não precisa de nada. Na versão 4 e acima você vai ter uma bela seta para trás, sem esforço adicional (isso pode ser feito em versões mais baixas, bem como com um pequeno código, eu vou colocá-lo abaixo) Você poderá definir estes dados na página Manifesto - >aplicação na interface gráfica (descer para a nome da actividade parental, e colocá-lo à mão)

Nó de Suporte:

Se você deseja suportar a versão abaixo da versão 4, você precisa incluir metadados também. clique com o botão direito sobre a atividade, adicionar->meta dados, Nome =android.suportar.PARENT_ACTIVIDADE e valor = your.full.activity.name

Para obter a seta bonita nas versões inferiores também:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Por favor, note que vai precisar da versão 7 da biblioteca de suporte para que tudo isto funcione, mas vale a pena!

 7
Author: donald, 2013-09-22 14:55:54
Tentei, mas não ajudou. Funcionou comigo.android:launchMode="singleInstance"
 4
Author: Pnemonic, 2015-03-04 08:20:04

Adicionando à resposta de @LorenCK, muda

NavUtils.navigateUpFromSameTask(this);

Para o código abaixo se a sua actividade pode ser iniciada a partir de outra actividade e isto pode tornar-se parte da tarefa iniciada por algum outro aplicativo

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
            .addNextIntentWithParentStack(upIntent)
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

Isto irá iniciar uma nova tarefa e iniciar a actividade-mãe da sua actividade que poderá definir no manifesto, como em baixo da versão SDK do Min

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />

Ou utilizar parentActivityName Se for > 15

 4
Author: Sourabh, 2016-03-22 19:13:57

O que funcionou para mim foi adicionar:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case android.R.id.home:
                onBackPressed();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public void onBackPressed() {
        finish();
    }

A TheRelevantActivity.java e agora está a funcionar como esperado

E não te esqueças de acrescentar:

getSupportActionbar.setDisplayHomeAsUpEnabled(true); MétodoonCreate()

 4
Author: Hammad Nasir, 2017-07-28 10:45:54

Tive um problema semelhante ao usar o android 5.0 com um mau nome de actividade parental

<activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
Removi a comunicação.exemplo.o meu primeiro mapa do nome da actividade parental e funcionou correctamente
 3
Author: Patrick Bergthold, 2014-10-29 16:35:09

Adicione à sua lista de actividades informações com o atributo

android:launchMode="singleTask"

Está a funcionar bem para mim

 2
Author: Pravesh Kumar, 2014-03-08 06:32:29

Na classe Java: -

    toolbar = (Toolbar) findViewById(R.id.apptool_bar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setTitle("Snapdeal");

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Em Manifesto: -

<activity
            android:name=".SubActivity"
            android:label="@string/title_activity_sub"
            android:theme="@style/AppTheme" >
            <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data>
    </activity>
Vai ajudar-te.
 2
Author: Kasthuri Shravankumar, 2016-05-28 07:39:41

Tenta isto:

Intent intent;
@Override
public void onCreate(Bundle savedInstanceState) {
intent = getIntent();   
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_b, menu);
return true;
}  


@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
    NavUtils.navigateUpTo(this,intent);
        return true;
}
return super.onOptionsItemSelected(item);
}
 1
Author: Luis Valadez, 2013-09-29 05:43:05
    @Override
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
    case android.R.id.home:
        finish();
        return true;
}
return super.onOptionsItemSelected(item);

Como uma prensa traseira

 1
Author: Dan Alboteanu, 2017-08-05 10:54:15
Entrar no meu manifesto e Adicionar à actividade fez-me bem.

Isto resolveu especificamente o meu problema porque não queria que o Android criasse uma nova instância da actividade anterior depois de carregar no botão Up na barra de ferramentas - em vez disso, quis usar a instância existente da actividade anterior quando subi a hierarquia de navegação.

Referência: android:launchMode

 0
Author: mumush, 2016-02-18 23:47:16

Tente esta solução use NavUtils.navegar a partir de uma máscara(esta); na actividade infantil: https://stackoverflow.com/a/49980835/7308789

 0
Author: Houssin Boulla, 2018-04-23 12:29:37

Utilize finish() em actividade para voltar quando carregar no evento.

 -1
Author: RajaReddy PolamReddy, 2012-09-05 07:00:12