Como faço para passar dados entre Atividades no aplicativo Android?

Eu tenho um cenário onde, após o login através de uma página de login, haverá um "botão" de saída em cada "atividade".

Ao clicar em sign-out, estarei passando o session id do usuário signatário para sign-out. Alguém pode me orientar sobre como manter o session id disponível para todas as atividades?

Qualquer alternativa a este caso

Solução

A maneira mais fácil de fazer isso seria passar o id da sessão para a atividade de signout no Intent que você está utilizando para iniciar a atividade:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Aceda a essa intenção na próxima actividade:

String sessionId = getIntent().getStringExtra("EXTRA_SESSION_ID");

O docs para Intenções tem mais informações (veja a seção intitulada "Extras").

Comentários (12)

Passar Intenção extras é uma boa abordagem, como Erich observou.

O objeto Aplicação é, no entanto, uma outra forma, e às vezes é mais fácil quando se lida com o mesmo estado através de múltiplas atividades (ao invés de ter que colocá-lo em qualquer lugar), ou objetos mais complexos do que os primitivos e Strings.

Você pode estender a Aplicação, e então definir/agrupar o que quiser lá e acessá-la de qualquer Atividade (na mesma aplicação) com getApplication().

Tenha também em mente que outras abordagens que você pode ver, como estática, podem ser problemáticas porque podem levar a vazamentos de memória. A aplicação também ajuda a resolver isso.

Comentários (6)

Tente fazer o seguinte:

Crie uma classe "ajudante" simples (fábrica para as suas intenções), como esta:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Esta será a fábrica para todas as suas intenções. Sempre que você precisar de uma nova intenção, crie um método de fábrica estático na IntentHelper. Para criar uma nova Intenção, você deve apenas dizer assim:

IntentHelper.createYourSpecialIntent(getIntent());

Na sua actividade. Quando você quiser "salvar" alguns dados em uma "sessão", basta usar o seguinte:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

E envia esta Intenção. Na atividade alvo seu campo estará disponível como:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Então agora podemos usar Intenção como na mesma sessão antiga (como em servlets ou JSP).

Comentários (0)