Eu tenho um cenário em que, depois de fazer login através de uma página de login, haverá uma saída button
em cada uma activity
.
Ao clicar sign-out
, passarei o session id
usuário conectado para sair. Alguém pode me orientar sobre como manter a session id
disponibilidade para todos activities
?
Qualquer alternativa para este caso
Respostas:
A maneira mais fácil de fazer isso seria passar o ID da sessão para a atividade de logout no site que
Intent
você está usando para iniciar a atividade:Acesse essa intenção na próxima atividade:
Os documentos para Intents têm mais informações (consulte a seção "Extras").
fonte
Long session_ids=getIntent().getExtras().getLong("EXTRA_SESSION_IDS");
setData
e qual a diferença entre essas duas abordagens? Qual é o melhor?Na sua Atividade atual, crie um novo
Intent
:Em seguida, na nova atividade, recupere esses valores:
Use esta técnica para passar variáveis de uma atividade para outra.
fonte
extras.getInt("new_variable_name")
. Se você tentar obtê-lo viagetString()
android, veja que um int foi dado e retorna nulo!startActivity(i);
? Quero dizer, posso fazer a atividade A chamar a atividade B e isso retorna os dados à atividade A ? estou confuso?Passar Intenção extras é uma boa abordagem, como observou Erich.
No entanto, o objeto Aplicativo é outra maneira, e às vezes é mais fácil lidar com o mesmo estado em várias atividades (em vez de precisar colocá-lo / colocá-lo em qualquer lugar) ou objetos mais complexos que primitivos e Strings.
Você pode estender o Aplicativo e definir / obter o que quiser lá e acessá-lo em qualquer Atividade (no mesmo aplicativo) com getApplication () .
Lembre-se também de que outras abordagens que você pode ver, como a estática, podem ser problemáticas porque podem levar a vazamentos de memória . Aplicação ajuda a resolver isso também.
fonte
Classe de origem:
Classe de destino (classe NewActivity):
fonte
Você só precisa enviar extras enquanto chama sua intenção.
Como isso:
Agora, no seu
OnCreate
método,SecondActivity
você pode buscar os extras como este.Se o valor que você enviou estava em
long
:Se o valor que você enviou foi
String
:Se o valor que você enviou foi
Boolean
:fonte
boolean
elong
getters que valem um comentário IMO, não uma resposta.Isso me ajuda a ver as coisas em contexto. Aqui estão dois exemplos.
Passando dados para a frente
Atividade principal
startActivity
.MainActivity.java
Segunda atividade
getIntent()
para iniciar oIntent
que iniciou a segunda atividade. Em seguida, você pode extrair os dados comgetExtras()
e a chave que você definiu na primeira atividade. Como nossos dados são uma String, usaremos apenasgetStringExtra
aqui.SecondActivity.java
Passando dados de volta
Atividade principal
startActivityForResult
, fornecendo um código de resultado arbitrário.onActivityResult
. Isso é chamado quando a Segunda Atividade termina. Você pode ter certeza de que é realmente a segunda atividade, verificando o código do resultado. (Isso é útil quando você está iniciando várias atividades diferentes da mesma atividade principal.)Intent
. Os dados são extraídos usando um par de valores-chave. Eu poderia usar qualquer string para a chave, mas usarei o predefinido,Intent.EXTRA_TEXT
pois estou enviando texto.MainActivity.java
Segunda atividade
Intent
. Os dados são armazenados noIntent
par usando valor-chave. Eu escolhi usarIntent.EXTRA_TEXT
a minha chave.RESULT_OK
e adicione a intenção que contém seus dados.finish()
para fechar a segunda atividade.SecondActivity.java
fonte
Atualizado Observe que eu havia mencionado o uso de SharedPreference . Possui uma API simples e é acessível nas atividades de um aplicativo. Mas essa é uma solução desajeitada e representa um risco de segurança se você passar dados confidenciais. É melhor usar intenções. Possui uma extensa lista de métodos sobrecarregados que podem ser usados para transferir melhor muitos tipos de dados diferentes entre as atividades. Dê uma olhada em intent.putExtra . Este link apresenta o uso do putExtra muito bem.
Ao passar dados entre atividades, minha abordagem preferida é criar um método estático para a atividade relevante que inclua os parâmetros necessários para ativar a intenção. Que, então, fornece facilmente os parâmetros de configuração e recuperação. Então pode ficar assim
Em seguida, você pode criar uma intenção para a atividade pretendida e garantir que você tenha todos os parâmetros. Você pode se adaptar a fragmentos. Um exemplo simples acima, mas você entendeu a ideia.
fonte
Tente fazer o seguinte:
Crie uma classe "auxiliar" simples (de fábrica para seus Intents), assim:
Esta será a fábrica para todos os seus objetivos. Sempre que você precisar de um novo Intent, crie um método estático de fábrica no IntentHelper. Para criar um novo Intent, basta dizer assim:
Na sua atividade. Quando você quiser "salvar" alguns dados em uma "sessão", use o seguinte:
E envie essa intenção. Na atividade de destino, seu campo estará disponível como:
Portanto, agora podemos usar o Intent como a mesma sessão antiga (como em servlets ou JSP ).
fonte
Você também pode passar objetos de classe personalizados criando uma classe parcelável . A melhor maneira de torná-lo parcelável é escrever sua turma e simplesmente colá-la em um site como http://www.parcelabler.com/ . Clique no build e você receberá um novo código. Copie tudo isso e substitua o conteúdo da classe original. Então-
e obtenha o resultado no NextActivity como
Agora você pode simplesmente usar o objeto foo como você teria usado.
fonte
Outra maneira é usar um campo estático público no qual você armazena dados, ou seja:
fonte
A maneira mais conveniente de passar dados entre as atividades é passando as intenções. Na primeira atividade de onde você deseja enviar dados, você deve adicionar código,
Você também deve importar
Em seguida, na próxima Acitvity (SecondActivity), você deve recuperar os dados da intenção usando o código a seguir.
fonte
Você pode usar
SharedPreferences
...Exploração madeireira. ID da sessão do repositório de horas
SharedPreferences
Sair. ID da sessão de busca por tempo em preferências compartilhadas
Se você não tiver o ID de sessão necessário, remova as preferências compartilhadas:
Isso é muito útil, porque uma vez você salva o valor e recupera qualquer lugar da atividade.
fonte
A abordagem padrão.
Agora, na sua segunda atividade, recupere seus dados do pacote:
Obter o pacote
Extraia os dados ...
fonte
i.putExtras()
/getIntent().getString()
que é proposto por 6 outras respostas ...Da atividade
Para Atividade
fonte
Bundle
abordagem baseada já foi proposta por PRABEESH RK em 2012 e Ajay Venugopal , Krishna . E poderia ser reduzido para oi.putExtras()
/getIntent().getString()
que é proposto por 8 outras respostas ...Você pode enviar dados entre atividades usando o objeto de intenção. Considere que você tem duas atividades, a saber
FirstActivity
eSecondActivity
.Por dentro da FirstActivity:
Usando Intenção:
Inside SecondActivity
Agora você pode usar métodos diferentes de classe de pacote configurável para obter valores transmitidos do FirstActivity por Key.
Por exemplo
bundle.getString("key")
,bundle.getDouble("key")
,bundle.getInt("key")
etc.fonte
Bundle
abordagem baseada já foi proposta por PRABEESH RK em 2012 e por Ajay Venugopal . E poderia ser reduzido para oi.putExtras()
/getIntent().getString()
que é proposto por 7 outras respostas ...Se você deseja transferir bitmap entre Atividades / Fragmentos
Atividade
Para passar um bitmap entre as atividades
E na classe Activity
Fragmento
Para passar um bitmap entre fragmentos
Para receber dentro do SecondFragment
Transferindo bitmaps grandes
Se você está obtendo uma falha na transação do fichário, isso significa que você está excedendo o buffer da transação do fichário transferindo um elemento grande de uma atividade para outra.
Portanto, nesse caso, você precisa compactar o bitmap como uma matriz de bytes e descompactá-lo em outra atividade , como esta
Na FirstActivity
E na SecondActivity
fonte
Você pode recuperá-lo em outra atividade. Dois caminhos:
A segunda maneira é:
fonte
Aqui está minha melhor prática e ajuda muito quando o projeto é enorme e complexo.
Suponha que eu tenha 2 atividades
LoginActivity
eHomeActivity
. Quero passar 2 parâmetros (nome de usuário e senha) deLoginActivity
paraHomeActivity
.Primeiro, eu crio meu
HomeIntent
Aqui está como passo os dados em meu LoginActivity
Etapa final, eis como recebo os dados em
HomeActivity
Feito! Legal :) Eu só quero compartilhar minha experiência. Se você está trabalhando em um projeto pequeno, esse não deve ser o grande problema. Mas quando você está trabalhando em um grande projeto, é realmente doloroso quando você quer refatorar ou corrigir bugs.
fonte
Resposta complementar: Convenções de nomenclatura para a sequência de chaves
O processo real de transmissão de dados já foi respondido, no entanto, a maioria das respostas usa seqüências codificadas para o nome da chave no Intent. Geralmente, isso é bom quando usado apenas no seu aplicativo. No entanto, a documentação recomenda o uso de
EXTRA_*
constantes para tipos de dados padronizados.Exemplo 1: Usando
Intent.EXTRA_*
ChavesPrimeira atividade
Segunda atividade:
Exemplo 2: Definindo sua própria
static final
chaveSe uma das
Intent.EXTRA_*
Strings não atender às suas necessidades, você poderá definir suas próprias no início da primeira atividade.Incluir o nome do pacote é apenas uma convenção se você estiver usando apenas a chave no seu próprio aplicativo. Mas é necessário evitar conflitos de nomenclatura se você estiver criando algum tipo de serviço que outros aplicativos podem chamar com um Intent.
Primeira atividade:
Segunda atividade:
Exemplo 3: Usando uma Chave de Recurso String
Embora não mencionado na documentação, esta resposta recomenda o uso de um recurso String para evitar dependências entre as atividades.
strings.xml
Primeira atividade
Segunda atividade
fonte
Você pode usar
Intent
Outra maneira poderia estar usando o padrão singleton também:
De sua FirstActivity
Em SecondActivity
fonte
A passagem de dados entre atividades é principalmente por meio de um objeto de intenção.
Primeiro, você deve anexar os dados ao objeto de intenção com o uso da
Bundle
classe. Em seguida, chamar a actividade utilizando umstartActivity()
oustartActivityForResult()
métodos.Você pode encontrar mais informações sobre isso, com um exemplo da postagem do blog Passando dados para uma atividade .
fonte
Intent#putExtra()
). Mas acrescenta outroBundle
e torna as coisas mais complicadas.Você pode tentar a preferência compartilhada; pode ser uma boa alternativa para compartilhar dados entre as atividades
Para salvar o ID da sessão -
Para obtê-los -
fonte
Iniciar outra atividade a partir desta atividade passar parâmetros via Bundle Object
Recuperar em outra atividade (YourActivity)
Isso é bom para tipos de dados simples. Mas se você quiser passar dados complexos entre as atividades, precisará serializá-los primeiro.
Aqui temos o modelo de funcionário
Você pode usar o Gson lib fornecido pelo google para serializar dados complexos como este
fonte
Kotlin
Passe da Primeira Atividade
Entre na Segunda Atividade
Sugestão
Sempre coloque as chaves em um arquivo constante para uma maneira mais gerenciada.
fonte
fonte
Charlie Collins me deu uma resposta perfeita usando o
Application.class
. Eu não sabia que poderíamos subclassificar tão facilmente. Aqui está um exemplo simplificado usando uma classe de aplicativo customizada.AndroidManifest.xml
Atribua o
android:name
atributo para usar sua própria classe de aplicativo.MyApplication.java
Use isso como um detentor de referência global. Funciona bem dentro de um mesmo processo.
MainActivity.java
Defina a referência global "singleton" para a instância do aplicativo.
MyPreferences.java
Um exemplo simples em que eu uso uma atividade principal de outra instância de atividade.
fonte
Lancei recentemente a API Vapor , uma estrutura Android com sabor jQuery que simplifica todos os tipos de tarefas como essa. Como mencionado,
SharedPreferences
é uma maneira de fazer isso.VaporSharedPreferences
é implementado como Singleton, de modo que é uma opção e, na API do Vapor, ele possui um.put(...)
método muito sobrecarregado , para que você não precise se preocupar explicitamente com o tipo de dados que está enviando - desde que com suporte. Também é fluente, para que você possa encadear chamadas:Ele também opcionalmente salva automaticamente as alterações e unifica o processo de leitura e gravação por baixo do capô, para que você não precise recuperar explicitamente um editor como no Android padrão.
Alternativamente, você pode usar um
Intent
. Na API do Vapor, você também pode usar o.put(...)
método sobrecarregado encadeável emVaporIntent
:E passe-o como um extra, como mencionado nas outras respostas. Você pode recuperar extras do seu
Activity
e, além disso, se você estiver usando,VaporActivity
isso é feito automaticamente para que você possa usar:Para recuperá-los na outra extremidade na
Activity
opção para.Espero que seja do interesse de alguns :)
fonte
Primeira atividade:
Segunda atividade:
fonte
Você pode passar dados entre atividades no aplicativo de 3 maneiras
transmitir dados intencionalmente tem algum limite. Para grande quantidade de dados, você pode usar o compartilhamento de dados no nível do aplicativo e armazená-lo no SharedPreference aumenta o tamanho do aplicativo
fonte
Use uma classe global:
Você pode chamar os setters e os getters desta classe de todas as outras classes. Faça isso, você precisa criar um Objeto GlobalClass em cada Atividade:
Então você pode ligar, por exemplo:
fonte