Os objetos Parcelable
e Bundle
precisam ser
usado além dos limites de processo, como com IPC/Binder.
transações, entre atividades com intents, e para armazenar o estado transitório em toda
mudanças. Esta página traz recomendações e práticas recomendadas para o uso
objetos Parcelable
e Bundle
.
Observação:Parcel
não é uma
de serialização, e você nunca deve
armazenar todos os dados do Parcel
em disco ou enviá-los pela rede.
Como enviar dados entre atividades
Quando um app cria um objeto Intent
para usar
startActivity(android.content.Intent)
ao iniciar uma nova atividade,
o app pode transmitir
usando o parâmetro putExtra(java.lang.String, java.lang.String)
.
O snippet de código a seguir mostra um exemplo de como realizar essa operação.
Kotlin
val intent = Intent(this, MyActivity::class.java).apply { putExtra("media_id", "a1b2c3") // ... } startActivity(intent)
Java
Intent intent = new Intent(this, MyActivity.class); intent.putExtra("media_id", "a1b2c3"); // ... startActivity(intent);
O SO organiza o Bundle
subjacente do intent. Depois, o SO cria
a nova atividade,
separa os dados e passa o intent para a nova atividade.
Recomendamos que você use a classe Bundle
para definir primitivos conhecidos pelo SO em
objetos Intent
. A classe Bundle
é altamente
otimizados para empacotar e desempacotar usando lotes.
Em alguns casos, você pode precisar de um mecanismo para envio de objetos compostos ou complexos entre as atividades.
Nesses casos, a classe personalizada deve implementar o Parcelable e fornecer os
writeToParcel(android.os.Parcel, int)
.
Ele também precisa fornecer um campo não nulo chamado CREATOR
que
implementa a interface Parcelable.Creator
, cuja
createFromParcel()
é usado para converter o Parcel
de volta ao objeto atual.
Para mais informações,
consulte a documentação de referência do objeto Parcelable
.
Ao enviar dados por meio de um intent, tenha o cuidado de limitar o tamanho dos dados a alguns KB.
O envio de muitos dados pode fazer com que o sistema gere uma
TransactionTooLargeException
.
Como enviar dados entre processos
Enviar dados entre processos é semelhante a fazer isso entre atividades. No entanto, ao enviar
entre processos, recomendamos que você não use parcelables personalizados. Se você enviar uma
Parcelable
de um app para outro, é preciso ter certeza de que o
a mesma versão da classe personalizada
presente nos apps de envio e recebimento. Em geral, essa é uma biblioteca comum
usados nos dois apps. Pode ocorrer um erro se o app tentar enviar um parcelable personalizado para
no sistema, porque ele não pode desempacotar uma classe da qual não tem conhecimento.
Por exemplo, um app pode definir um alarme usando
a classe AlarmManager
e usar um Parcelable
personalizado
sobre a intenção do alarme. Quando o alarme dispara, o sistema modifica o intent
Bundle
de extras para adicionar
uma contagem repetida. Essa modificação pode resultar na remoção do sistema
Parcelable
dos extras. Essa remoção, por sua vez, pode resultar na
falha ao receber a intent de alarme modificada, porque o app espera
para receber dados extras que não existem mais.
O buffer de transação do binder tem um tamanho fixo limitado, atualmente de 1 MB, que é compartilhado por todos transações em andamento para o processo. Como esse limite está no processo e não por atividade, essas transações incluem todas as transações de binder app, como onSaveInstanceState, startActivity e qualquer interação com o sistema. Quando o tamanho for excedido, uma TransactionTooLargeException será gerada.
Para o caso específico de savedInstanceState, a quantidade de dados deve ser mantida pequena porque o processo do sistema precisa manter os dados fornecidos pelo tempo que o usuário pode voltar a essa atividade (mesmo se o processo da atividade for encerrado). Recomendamos que você mantenha o estado salvo para menos de 50 mil dados.
Observação:no Android 7.0 (nível 24 da API) e versões mais recentes, o sistema gera uma TransactionTooLargeException como uma exceção de execução. Nas versões anteriores do Android, o sistema só mostra um aviso no logcat.