Pergunta

Eu tenho A Atividade com android:launchMode="singleTop" no manifesto.

Se eu for para B atividades, C e D lá eu tenho atalhos do menu para voltar a minha actividade aplicações raiz (A).

Os olhares código como este:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
startActivity(myIntent);

No entanto, ao invés de retornar ao A instância já existente do meu MainActivity.class ele cria uma nova instância -.> Ele vai para onCreate() vez de onNewIntent()

Este não é o comportamento esperado, certo?

Foi útil?

Solução

Isso deve fazer o truque.

<activity ... android:launchMode="singleTop" />

Quando você cria uma intenção de iniciar o uso app:

Intent intent= new Intent(context, YourActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Este é que deve ser necessário.

Outras dicas

O que realmente funcionou para mim no final foi a seguinte:

Intent myIntent = new Intent(getBaseContext(), MainActivity.class);
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);

Citação da documentação :

O "padrão" e modos "singleTop" diferem entre si em apenas um respeitar: Toda vez que há uma nova intenção para uma atividade de "padrão", uma nova instância da classe é criada para responder a essa intenção. cada instância lida com uma única intenção. Da mesma forma, um nova instância de uma atividade "singleTop" também podem ser criados para lidar com uma nova intenção. No entanto, se a tarefa alvo já tem uma instância existente do a actividade na parte superior da sua pilha , essa instância receberá a nova intenção (em uma onNewIntent () ligar); uma nova instância não é criada.

Eu não estou 100% certo o que "já tem uma instância existente da atividade no topo da sua pilha" significa, mas talvez a sua actividade não está a cumprir esta condição.

Será que singleTask ou singleInstance trabalho para você? Ou talvez você pode tentar definir FLAG_ACTIVITY_SINGLE_TOP na intenção que você está criando para ver se isso faz a diferença, embora eu não acho que vai.

Você pode voltar para a mesma instância de actividade existentes, com android:launchMode="singleInstance"

no manifesto. Quando você retornar ao A de B, pode ser necessária finish() para destruir B.

Em primeiro lugar, a estrutura de pilha pode ser examinado

. Para o modo de lançamento: singleTop
Se uma instância da mesma atividade já está no topo da pilha de tarefas, então esta instância será reutilizado para responder à intenção.

Todas as atividades são hold na pilha ( "pela primeira vez na última out") por isso, se sua atividade atual está no topo da pilha e se você defini-lo na manifest.file como singleTop

android:name=".ActivityA"
android:launchMode="singleTop"

Se você está no ActivityA recriar a atividade não vai entrar onCreate retomará onNewIntent () e você pode ver através da criação de uma notificação Não: Se você não implementar onNewIntent (Intenção), você não terá nova intenção

.
Intent activityMain = new Intent(ActivityA.this,
                        ActivityA.class);

                activityMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
                startActivity(activityMain);




    @Override
        protected void onNewIntent(Intent intent) {

            super.onNewIntent(intent);

            notify("onNewIntent");
        }

        private void notify(String methodName) {

            String name = this.getClass().getName();
            String[] strings = name.split("\\.");

            Notification noti = new Notification.Builder(this)
                    .setContentTitle(methodName + "" + strings[strings.length - 1])
                    .setAutoCancel(true).setSmallIcon(R.drawable.ic_launcher)
                    .setContentText(name).build();
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.notify((int) System.currentTimeMillis(), noti);

        }

Isso ocorre porque a atividade original Um já está sendo destruída pelo tempo que você iniciá-lo de B, C ou D. Por isso, onCreate será chamado em vez de onNewIntent (). Uma maneira de resolver isso é para sempre destruir o existente A (usando FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK conjunto quando startActivity) antes de iniciar um novo A, assim onCreate sempre será chamado, e você colocar o código de onNewIntent () em onCreate, verificando se getIntent ( ) é a intenção com que começou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top