Método onCreate de uma Activity chamado várias vezes sem intenção

205 views
Skip to first unread message

Márcio Oliveira

unread,
Feb 15, 2012, 7:40:42 AM2/15/12
to androidb...@googlegroups.com
Pessoal,

Não sei se já passaram por isso, mas gostaria de compartilhar minha
duvida/problema que estou tendo.

Para encurtar a historia é o seguinte. Tenho um requisito de ter uma
Activity, que é a main e Laucher que não tem tela nenhuma mas que vai
gerenciar todas as outras activities e não usar a pilha de activities
do android (não me perguntem porque, é um requisito imútavel eheheh).

Ontem vi que o método onCreate desta activity era chamado umas 3 vezes
no decorrer do funcionamento do sistema, fazendo com que executasse um
código que eu gostaria que executasse uma única vez! Percebi que o
Bundle (persistentState) que vem como parametro do OnCreate na
primeira vez vem nulo, e depois nas outras vezes vem com uma estrutura
válida, então para nao executar o código que tenho ali novamente, fiz
a comparação para executar somente quando é nulo. Isso me gerou outros
problemas, pois parece que esta activity realmente morreu do nada e
tem q executar tudo novamente, pois todos seus atributos foram
deletados, mas eu nao poderia executar tudo novamente.

Pelo site do android li o seguinte quando o método onDestroy é
chamado: "someone called finish() on it, or because the system is
temporarily destroying this instance of the activity to save space".
Eu não chamo o finish em lugar nenhum, então parece que é o próprio
sistema que esta matando esta activity tentando liberar recursos...
Minhas perguntas são:

1 - Vocês sabem se tem como deixar uma activity sempre persistente e
não ser destruída como este caso?
2 - Será que pode ser problema de memória, e aumentando isso no
simulador resolveria?

Se alguém já passou por isso e puder dar uma dica...

Sds,

Márcio

luciofm

unread,
Feb 15, 2012, 8:05:40 AM2/15/12
to androidb...@googlegroups.com
Márcio,

Te aconselho a estudar a fundo o Ciclo de Vida de Aplicativos e
Activities no Android.

O sistema pode "matar" uma activity não visivel (depois de chamar
onPause() até o gingerbread ou depois do onStop() a partir do
honeycomb) para liberar memória. Essa activity é recriada
automaticamente pelo sistema quando necessário, passando o Bundle
savedInstance que contem os dados salvos pela activity.

Lúcio Maciel
luc...@gmail.com

2012/2/15 Márcio Oliveira <prof...@gmail.com>:

Márcio Oliveira

unread,
Feb 15, 2012, 10:39:00 AM2/15/12
to androidb...@googlegroups.com
Oi Lucio,

Obrigado pela dica!
Isto é horrivel do ponto de vista de modelagem né, estranho e
decepcionante este mecanismo. Vou tentar estudar mais e entender
melhor e tentar fazer um Workaround para este problema. Se alguem
tiver mais alguma dica, será bem vinda!!

Sds,

Márcio

Neto Marin

unread,
Feb 15, 2012, 10:46:38 AM2/15/12
to androidb...@googlegroups.com
Ola Márcio,

Eu discordo de você.
Lembre-se que se trata de um dispositivo com recursos limitados, e que, normalmente o usuário deixa várias apps abertas e tem boot com baixa frequência.
Se o SO não desenvolver algum mecanismo de liberar memória e processamento, se tornaria extremamente lento.

E além disso, conhecendo a plataforma vc vai ver como é extremamente simples lidar com isso. Como disse o Lúcio, é preciso conhecer o ciclo de vida de uma aplicação.

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin

Márcio Oliveira

unread,
Feb 15, 2012, 10:54:54 AM2/15/12
to androidb...@googlegroups.com
Olá Neto,

Concordo com voce em relação a ter um mecanismo para liberar memória,
mas acho que deveria haver algo mais indicativo que o sistema não
liberasse o que eu não quisesse, ou que liberasse por ultimo com uma
certa prioridade. Além disso, eu estou com uma aplicação simples sem
muitas telas (apesar que algumas telas tem vários botões como um
teclado), acredito que não deveria estar matando esta activity por
falta de recurso ao meu ver.

Por falar em lidar com isso, alguem tem algum exemplo didatico de como
eu poderia contornar este problema, sei la, tipo no onDestroy eu salvo
o Contexto de atributos no Bundle da Activity (talvez no
setPersistentState, algo assim), e no OnCreate eu pego isso e
reatribuo para os atributos, mas ou menos assim q poderia ficar?

Sds

Neto Marin

unread,
Feb 15, 2012, 11:03:30 AM2/15/12
to androidb...@googlegroups.com
Eu entendo o que vc quis dizer, mas quando se trata de um dispositivo onde o usuário é o foco, as apps as precisam ser "mortas" de qualquer forma. E no telefone celular o foco não é a app. E além disso, se o SO deixasse o desenvolvedor definir prioridade, todas as apps iria querer ser prioritarias e ai teríamos um problema também.

De uma olhada na documentação (http://developer.android.com/reference/android/app/Activity.html), e na descrição dos método onStop e onPause.
Então, você salva o que é importante e no onStart vc tem o q por acaso tenha salvo. É igual a idéia de tratar rotação por exemplo, onde a activity é destruída e recriada na nova orientação.

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: neto...@gmail.com
MSN: neto_...@hotmail.com
Skype: netomarin


Reply all
Reply to author
Forward
0 new messages