Estou tentando trabalhar no envio de um objeto do meu cliente classe de de um Activity
e exibi-lo em outro Activity
.
O código para a classe do cliente:
public class Customer {
private String firstName, lastName, Address;
int Age;
public Customer(String fname, String lname, int age, String address) {
firstName = fname;
lastName = lname;
Age = age;
Address = address;
}
public String printValues() {
String data = null;
data = "First Name :" + firstName + " Last Name :" + lastName
+ " Age : " + Age + " Address : " + Address;
return data;
}
}
Eu quero enviar seu objeto de um Activity
para outro e, em seguida, exibir os dados no outro Activity
.
Como posso conseguir isso?
java
android
object
android-intent
android-activity
Kaibuki
fonte
fonte
Respostas:
Uma opção pode ser permitir que sua classe personalizada implemente a
Serializable
interface e, em seguida, você pode transmitir instâncias de objeto com a intenção extra usando aputExtra(Serializable..)
variante doIntent#putExtra()
método.Pseudocódigo :
Nota: Verifique se cada classe aninhada da sua classe personalizada principal implementou a interface Serializable para evitar exceções de serialização. Por exemplo:
fonte
Parcelable
é projetado especificamente para esse fim (e muito mais rápido queSerializable
). Eu estou confuso.Parcelable
pode ser bom para velocidade, mas é complicado de implementar. E se você tiver 8 objetos para passar entre as atividades, você fará cada umParcelable
? Em vez disso, faria mais sentido usarSerializable
. Ao implementar,Parcelable
você precisa adicionar muito código à classe e ordenar os campos de uma maneira muito específica;Serializable
você não Por fim, acho que tudo se resume a quantos objetos você está passando e o que está tentando fazer.Serializable
é uma interface Java padrão. Você simplesmente marca uma classe como serializável ao implantar a interface, e o Java a serializa automaticamente em determinadas situações.Parcelable
é uma interface específica do Android em que você mesmo implementa a serialização. Ele foi criado para ser muito mais eficiente que Serializable, e para contornar alguns problemas com o esquema de serialização Java padrãoImplemente sua classe com Serializable. Vamos supor que esta seja sua classe de entidade:
Estamos enviando o objeto chamado
dene
da atividade X para a atividade Y. Em algum lugar da atividade X;Na atividade Y, estamos obtendo o objeto.
É isso aí.
fonte
classCastException: java.lang.Long
fazer isso. Você pode, por favor, explicar o porquê?(Serializable)
o objeto?Você pode gerar código Parcelable para sua classe usando este site .
fonte
Parcelable
, prefiro manter minhas classes POJO independentes do Android e usá-lasSerializable
.Use gson para converter seu objeto em JSON e transmiti-lo através da intenção. Na nova atividade, converta o JSON em um objeto.
No seu
build.gradle
, adicione isso às suas dependênciasNa sua atividade, converta o objeto em json-string:
Na sua atividade de recebimento, converta a string json novamente no objeto original:
Para Kotlin é exatamente o mesmo
Passe os dados
Receba os dados
fonte
Ao chamar uma atividade
No toClass.java, receba a atividade por
Certifique-se de que a classe do cliente implemente pacotes
fonte
Na minha experiência, existem três soluções principais, cada uma com suas desvantagens e vantagens:
Implementando Parcelable
Implementando Serializable
Usando algum tipo de biblioteca de barramento de eventos leve (por exemplo, EventBus da Greenrobot ou Otto da Square)
Parcelável - padrão rápido e Android, mas possui muitos códigos padrão e requer seqüências codificadas para referência ao extrair valores da intenção (não fortemente tipada).
Serializável - clichê próximo a zero, mas é a abordagem mais lenta e também requer seqüências codificadas durante a extração de valores da intenção (não fortemente tipada).
Barramento de Eventos - clichê zero, abordagem mais rápida e não requer sequências codificadas, mas requer uma dependência adicional (embora geralmente leve, ~ 40 KB)
Publiquei uma comparação muito detalhada dessas três abordagens, incluindo benchmarks de eficiência.
fonte
Encontrei um método simples e elegante:
Método 1
Código para a primeira atividade:
Código para a segunda atividade:
você encontrará
objSent
eobjReceived
terá o mesmohashCode
, então eles são idênticos.Mas por que podemos passar um objeto java dessa maneira?
Na verdade, o fichário do Android criará uma referência JNI global para o objeto java e liberará essa referência JNI global quando não houver uma referência para esse objeto java. O fichário salvará essa referência JNI global no objeto Binder.
* CUIDADO: esse método funciona apenas a menos que as duas atividades sejam executadas no mesmo processo; caso contrário, jogue ClassCastException em (ObjectWrapperForBinder) getIntent (). GetExtras (). GetBinder ("object_value") *
classe definição de ObjectWrapperForBinder
Método 2
Mas o Método 2 tem um problema pequeno, mas sério, se o receptor falhar ao restaurar o objeto java (por exemplo, alguma exceção ocorre antes de restaurar o objeto java ou a Atividade do receptor não existir), o objeto java se tornará um órfão ou vazamento de memória, o método 1 não tem esse problema, porque o fichário do Android lidará com essa exceção
Método 3
Para chamar o objeto java remotamente, criaremos um contrato / interface de dados para descrever o objeto java, usaremos o arquivo aidl
IDataContract.aidl
Código para a primeira atividade
Código para a segunda atividade:
altere o atributo android: process no AndroidManifest.xml para um nome de processo não vazio para garantir que a segunda atividade seja executada em outro processo
Dessa maneira, podemos transmitir uma interface entre duas atividades, mesmo que elas sejam executadas em processos diferentes, e chamar o método da interface remotamente
Método 4
O método 3 parece não ser simples o suficiente, porque precisamos implementar uma interface de auxílio. Se você quiser apenas uma tarefa simples e o valor de retorno do método for desnecessário, podemos usar android.os.Messenger
Código da primeira atividade (remetente):
Código para a segunda atividade (destinatário):
Todo o Messenger.send será executado em um manipulador de forma assíncrona e seqüencial.
Na verdade, android.os.Messenger também é uma interface de auxílio, se você tiver o código-fonte do Android, poderá encontrar um arquivo chamado IMessenger.aidl
fonte
Você também pode gravar os dados do objeto em Strings e ints temporários e passá-los para a atividade. É claro que dessa forma, você obtém os dados transportados, mas não o próprio objeto.
Mas se você apenas deseja exibi-los, e não usar o objeto em outro método ou algo parecido, isso deve ser suficiente. Fiz da mesma maneira apenas para exibir dados de um objeto em outra atividade.
Você também pode passá-los diretamente ao invés dos temporários, mas dessa forma fica mais claro, na minha opinião. Além disso, você pode definir os valores temporários para nulos, para que sejam limpos pelo GarbageCollector mais cedo.
Boa sorte!
Em uma nota lateral: substitua toString () em vez de escrever seu próprio método de impressão.
Conforme mencionado nos comentários abaixo, é assim que você recupera seus dados em outra atividade:
fonte
Bundle extras = getIntent().getExtras();
String val = extras.getString("fname");
Eu fiz uma classe auxiliar única que contém objetos temporários.
Em vez de colocar seus objetos no Intent, use IntentHelper:
Dentro da sua nova atividade, você pode obter o objeto:
Lembre-se de que, uma vez carregado, o objeto é removido para evitar referências desnecessárias.
fonte
BookActivity.getInstance().recommendationResponse
inRoomsActivity
obj
se tornanull
. Para evitar isso,obj
deve ser armazenado em algum lugar para obtê-lo novamente. De fato, a solução Json armazena dados de objetos no Intent.Existem algumas maneiras pelas quais você pode acessar variáveis ou objetos em outras classes ou atividades.
A. Banco de Dados
B. Preferências compartilhadas.
C. Serialização de objetos.
D. Uma classe que pode conter dados comuns pode ser nomeada como Utilitários Comuns. Depende de você.
E. Passagem de dados através de Intents e Parcelable Interface.
Depende das necessidades do seu projeto.
A. Banco de Dados
SQLite é um banco de dados de código aberto incorporado ao Android. O SQLite suporta recursos padrão de banco de dados relacional, como sintaxe SQL, transações e instruções preparadas.
Tutoriais
B. Preferências compartilhadas
Suponha que você queira armazenar o nome de usuário. Portanto, agora haverá duas coisas, um nome de usuário chave , valor valor.
Como guardar
Usando putString (), putBoolean (), putInt (), putFloat () e putLong (), você pode salvar o tipo de dt desejado.
Como buscar
http://developer.android.com/reference/android/content/SharedPreferences.html
C. Serialização de objetos
A serlização de objetos é usada se queremos salvar um estado de objeto para enviá-lo por uma rede ou se você pode usá-lo também para sua finalidade.
Use Java beans e armazene-o como um de seus campos e use getters e setter para isso.
JavaBeans são classes Java que possuem propriedades. Pense nas propriedades como variáveis de instância privada. Como eles são particulares, a única maneira de acessá-los de fora da classe é através dos métodos da classe. Os métodos que alteram o valor de uma propriedade são chamados métodos setter, e os métodos que recuperam o valor de uma propriedade são chamados métodos getter.
Defina a variável no seu método de email usando
Em seguida, use a serialização de objetos para serializar esse objeto e em sua outra classe desserializar esse objeto.
Na serialização, um objeto pode ser representado como uma sequência de bytes que inclui os dados do objeto, além de informações sobre o tipo do objeto e os tipos de dados armazenados no objeto.
Depois que um objeto serializado é gravado em um arquivo, ele pode ser lido e desserializado. Ou seja, as informações de tipo e bytes que representam o objeto e seus dados podem ser usados para recriar o objeto na memória.
Se você deseja um tutorial para isso, consulte:
Serialização em Java (postagem no blog)
Obter variável em outras classes (estouro de pilha)
D. Utilidades comuns
Você pode fazer uma aula sozinho, que pode conter dados comuns que você precisa com freqüência em seu projeto.
Amostra
E. Passando dados pelas intenções
Consulte o tutorial Android - Dados do pacote para passar entre Atividades usando classes Parcelable para esta opção de passagem de dados.
fonte
Crie sua própria classe da
Customer
seguinte maneira:No seu
onCreate()
métodoNa
xyz activity
aula, você precisa usar o seguinte código:fonte
A melhor maneira é ter uma classe (chamada Control) em seu aplicativo que conterá uma variável estática do tipo 'Customer' (no seu caso). Inicialize a variável em sua Atividade A.
Por exemplo:
Em seguida, vá para a Atividade B e busque-a na classe Control. Não se esqueça de atribuir um nulo depois de usar a variável, caso contrário, a memória será desperdiçada.
fonte
Agora você deseja passar o objeto desta classe em startActivity. Simplesmente use isto:
Isso funciona aqui porque o MyClass é implementado
Serializable
.fonte
Se você optar por usar da maneira que o Samuh descreve, lembre-se de que apenas valores primitivos podem ser enviados. Ou seja, valores que são parceláveis. Portanto, se seu objeto contiver objetos complexos, eles não serão seguidos. Por exemplo, variáveis como Bitmap, HashMap etc ... Elas são difíceis de passar pela intenção.
Em geral, eu conselho você daria para enviar tipos de dados única primitivos como extras, como String, int, boolean etc. No seu caso seria:
String fname
,String lname
,int age
, eString address
.Minha opinião: Objetos mais complexos são melhor compartilhados com a implementação de um ContentProvider , SDCard , etc. Também é possível usar uma variável estática , mas isso pode levar rapidamente a códigos propensos a erros ...
Mas, novamente, é apenas a minha opinião subjetiva.
fonte
Estou usando o parcelable para enviar dados de uma atividade para outra atividade. Aqui está o meu código que funciona bem no meu projeto.
Em activityA, use-o assim:
No ActivityB, use-o assim para obter dados:
fonte
Você pode tentar usar essa classe. A limitação é que ele não pode ser usado fora de um processo.
Uma atividade:
Outra atividade:
fonte
Inicie outra atividade a partir dessa atividade e transmita parâmetros via Bundle Object
Recuperar dados em outra atividade (YourActivity)
Isso é bom para tipos simples de dados. Mas se você deseja passar dados complexos entre as atividades. Você precisa serializar primeiro.
Aqui temos o modelo de funcionário
Você pode usar o Gson lib fornecido pelo google para serializar dados complexos como este
fonte
Esta questão também é discutida em outra questão do Stack Overflow. Veja uma solução para a transmissão de dados através da intenção usando Serializable . O ponto principal é sobre o uso de
Bundle
objetos que armazenam os dados necessários dentroIntent
.Para extrair valores:
A vantagem
Serializable
é a sua simplicidade. No entanto, considere usar oParcelable
método se precisar de muitos dados para serem transferidos, porqueParcelable
foi projetado especificamente para Android e é mais eficiente queSerializable
. Você pode criar umaParcelable
classe usando:fonte
Crie uma classe como a classe bean e implemente a
Serializable
interface. Então, podemos passar pelointent
método, por exemplo:Em seguida, obtenha-o da outra atividade, por exemplo:
fonte
Crie dois métodos em sua classe personalizada como esta
Agora, no seu remetente Activity, faça o seguinte
E no seu receptor Atividade
fonte
Sim, o uso de um objeto estático é de longe a maneira mais fácil de fazer isso com objetos personalizados não serializáveis.
fonte
static
é a melhor solução alternativa, se for simplesmente impraticável continuar invocandoputExtra()
todas as propriedades que você deseja transmitir. Por exemplo, agora, quero passar umArrayList
que contenha objetos. Eu também poderia criar meu ArrayListstatic
.Os objetos da atividade do Android podem ser destruídos e reconstituídos. Portanto, você precisará usar outra abordagem para procurá- los - ou qualquer objeto que eles criarem !!! - acima. Ou seja, você pode passar como referência de classe estática, mas o identificador de objeto (Java chama essas "referências", como o SmallTalk; mas elas não são referências no sentido de C ou montagem) possivelmente será inválido posteriormente porque um "recurso" do Android OE é qualquer atividade que pode ser aniquilada e reconstituída posteriormente.
A pergunta original perguntou "Como passar um objeto de uma atividade para outra no Android" e ninguém respondeu a isso. Com certeza, você pode serializar (Serializable, Parcelable, de / para JSON) e passar uma cópia dos dados do objeto e um novo objeto com os mesmos dados pode ser criado; mas NÃO terá as mesmas referências / identificadores. Além disso, muitos outros mencionaram que você pode armazenar a referência em um armazenamento estático. E isso funcionará a menos que o Android decida destruir sua atividade.
Portanto, para realmente resolver a questão original, você precisaria de uma pesquisa estática e cada objeto atualizará sua referência quando / se for recriado. Por exemplo, cada atividade do Android se revistaria se seu onCreate for chamado. Você também pode ver como algumas pessoas usam a lista de tarefas para pesquisar uma Atividade pelo nome. (o sistema está destruindo temporariamente esta instância da atividade para economizar espaço .. getRunningTasks, a lista de tarefas é efetivamente uma lista especializada da instância de objeto mais recente de cada atividade).
Para referência:
Portanto, o barramento de mensagens é uma solução viável. Basicamente, "pontapés". Em vez de tentar ter referências a objetos; então você re-arquiteta seu design para usar MessagePassing em vez de SequentialCode. Exponencialmente mais difícil de depurar; mas permite que você ignore esse tipo de entendimento do OperatingEnvironment. Efetivamente, cada acesso ao método de objeto é invertido para que o chamador publique uma mensagem e o próprio objeto defina um manipulador para essa mensagem. Muito mais código, mas pode torná-lo robusto com as restrições do Android OE.
Se tudo o que você deseja é a Atividade principal (coisa típica nos aplicativos Android devido à necessidade de "Contexto" em qualquer lugar)), basta que cada Atividade seja listada como "superior" no espaço estático global sempre que seu onResume for chamado. Em seguida, seu AlertDialog ou qualquer outro que precise de um contexto pode capturá-lo a partir daí. Além disso, é um pouco estranho usar um global, mas pode simplificar a passagem de um Contexto para cima e para baixo em todos os lugares e, com certeza, quando você usa um MessageBus, o TI é global de qualquer maneira.
fonte
Eu sei que a estática é ruim, mas parece que somos forçados a usá-la aqui. O problema com parceables / seriazables é que as duas atividades têm instâncias duplicadas do mesmo objeto = desperdício de memória e CPU.
Atividade de chamada
Atividade chamada (observe que onCreate () e onResume () podem ser chamados várias vezes quando o sistema destrói e recria atividades)
Outra maneira é declarar um campo estático da classe que você deseja passar nessa mesma classe. Servirá apenas para esse fim. Não esqueça que ele pode ser nulo no onCreate, porque seu pacote de aplicativos foi descarregado da memória pelo sistema e recarregado posteriormente.
Tendo em mente que você ainda precisa lidar com o ciclo de vida da atividade, convém gravar todos os dados diretamente nas preferências compartilhadas, exigindo estruturas de dados complexas.
fonte
As respostas acima quase todas corretas, mas para quem não entende essas respostas, o Android possui a poderosa classe Intent. Com a ajuda, você compartilha dados entre não apenas a atividade, mas também outros componentes do Android (receptor de radiodifusão, servis para conteúdo, desde que utilizemos a classe ContetnResolver no Intent ) Em sua atividade, você cria intenção
Em sua atividade recorrente, você tem
Você precisa implementar a interface Parceable ou Serializable no seu objeto para compartilhar entre as atividades. É difícil implementar o Parcealbe em vez da interface serializável no objeto, por isso o android possui um plugin especialmente para isso.
fonte
Eu sempre me perguntei por que isso não pode ser tão simples quanto chamar um método da outra atividade. Recentemente, escrevi uma biblioteca de utilidades que a torna quase tão simples quanto isso. Você pode conferir aqui ( https://github.com/noxiouswinter/gnlib_android/wiki/gnlauncher ).
O GNLauncher torna o envio de objetos / dados para uma atividade de outra atividade etc tão fácil quanto chamar uma função nessa atividade com os dados necessários como parâmetros. Ele introduz a segurança de tipo e remove todas as dificuldades de ter que serializar, anexando à intenção usando chaves de string e desfazendo a mesma na outra extremidade.
Uso
Defina uma interface com os métodos que você deseja chamar na Atividade para iniciar.
Implemente a interface acima na Atividade para iniciar. Notifique também o GNLauncher quando a atividade estiver pronta.
Na outra atividade, obtenha um proxy para a atividade acima e chame qualquer método com os parâmetros desejados.
A primeira atividade será iniciada e o método chamado com os parâmetros necessários.
Pré-requisitos
Consulte https://github.com/noxiouswinter/gnlib_android/wiki#prerequisites para obter informações sobre como adicionar as dependências.
fonte
Passe o objeto de uma atividade para outra.
(1) atividade de origem
(2) atividade de destino
fonte
Eu costumava definir objetos com Pacelable ou Serializable para transferir, mas sempre que adiciono outras variáveis ao objeto (modelo), tenho que registrar tudo. É tão inconveniente.
É super fácil transferir objetos entre atividades ou fragmentos.
Android DataCache
fonte
Podemos passar o objeto de uma atividade para outra:
Dentro
poSuppliersDetails
temos alguns valores. Agora estou enviando este objeto para a atividade de destino:Como obter isso no ACtivityTwo:
fonte
Passe uma atividade para outra:
Obter valores:
fonte
Olá a todos, vejo muitas boas opções, mas eu queria saber por que o Binding não foi usado?
Criar um fichário é bastante simples ...
E criar o pacote para usá-lo não é tão ruim assim.
Essa lógica é muito legal porque você está realmente passando uma referência de atividade para atividade.
e para implementar isso, você apenas ...
Enviá-lo
Pegue de volta
Caramba, alguém poderia ficar louco e fazer deste otário um verdadeiro genérico.
fonte