Sempre que uma aplicação é fechada o método destroyApp é chamado?
Se a aplicação é fechada pelo AMS sim, pois o AMS é que chama destroyApp, nunca a midlet (embora tenha gente que faça esta “caca”).
Se a aplicação é fechada pelo programador, destroyApp não é chamada, pois o programador fechou ela através de notifyDestroyed.
E tem como “forçar” o AMS chamar o método destroyApp, quando o programador chama notifyDestroyed?
Como eu te disse, o programador nunca deveria chamar este método, pois quem chama é o AMS (Application Management System) do celular, portanto, não é tarefa do programador, mas sim do sistema chamar este método.
Não faz sentido você querer que o ele seja executado.
Suspeito que você colocou código em destroyApp que quer que seja executado quando a midlet encerrar.
Se for isto, coloque em uma método e coloque uma chamada dele antes de notifyDestroyed e dentro de destroyApp. Pronto, em ambas as situações de termino da aplicação, o código vai ser executado.
Se não for isto, clareie para mim porquê você está insistindo em querer chamar este método ?
O problema é que eu não fiz a aplicação que está chamando o método notifyDestroyed.
As poucas aplicações que eu fiz eu coloco tudo dentro de destroyApp e ai chamo este método para fechar a aplicação.
E esta outra aplicação chama em determinado momento do código o método notifyDestroyed e o pior disso é que não tenho o source do aplicativo.
Para adaptar a aplicação “velha” eu estava fazendo injections no código, mas ai cai neste problema na hora de fechar o aplicativo.
[quote=Jedi_FeniX]…As poucas aplicações que eu fiz eu coloco tudo dentro de destroyApp e ai chamo este método para fechar a aplicação.
[/quote]
[FEDÔ=ON]Caca detected ! [/FEDÔ]
Como eu disse, vc não deveria estar chamando destroyApp, pois este método não é seu, é do AMS…a única forma de um programa fechar a aplicação é usar notifyDestroyed. Não há outra. A chamada direta a destroyApp, não tem nenhum efeito além de ser tratada como uma chamada comum, e não pode (deve) ser feita pelo programador, somente pelo AMS. Espero que suas novas aplicações sejam feitas do modo certo a partir de agora que ficou bem claro como funciona o esquema de termino da aplicacao.
Muita gente tropeça também com o método startApp, colocando ali código de inicialização e não testando para ver se a aplicação já estava rodando anteriormente.O resultando é novos objetos sendo instanciados a toa…
:oops: hehehhehe :oops:
Também faço isso do método startApp. Mas foi porque eu vi isso em uma apostila na internet.
Então, não tem como ver a hora que o programa é fechado?
Estava tentando tirar esta dúvida sobre como fechar a aplicação, porque tenho que desenvolver uma aplicação deste tipo.
Pegar jars, que são aplicações prontoas e incluir uma tela antes da aplicação inicializar e incluir outra tela quando a aplicação fechar. E claro, tenho autorização para fazer isso com os jars.
A tela que entra antes da aplicação foi tranquilo, só herdei a MIDlet do jar e refiz a inicialização. O problema foi na hora de fechar, porque tem gente que fecha o aplicativo pelo método notifyDestroyed e outros pelo método destroyApp.
Quando eles fecham pelo método destroyApp eu posso seguir o mesmo raciocínio que o método startApp, mas se for pelo método notifyDestroyed não tem como.
Alguém teria alguma idéia para ajudar?
[quote=Jedi_FeniX]
Quando eles fecham pelo método destroyApp eu posso seguir o mesmo raciocínio que o método startApp, mas se for pelo método notifyDestroyed não tem como.
Alguém teria alguma idéia para ajudar?[/quote]
Cara, pelo amor de D…eu já te dei a sua resposta…aff!!! :roll:
Antes do notifyDestroyed coloca uma chamada a mesma rotina que é chamada em destroyApp. Não tem erro…
Vou desenhar:
protected void destroyApp() {
faz_limpeza();
}
private void saiDaAplicacao() {
faz_limpeza();
notifyDestroyed();
}
private void faz_limpeza() {
// aqui vai o codigo q nao importa como a midlet foi fechada, tem que ser chamado
}
Difícel né ? :?
Essa sua solução ajudou. O problema que eu não tenho os códigos do jars. O que eu pude fazer com a sua solução foi fazer injections nos .class do jar.
Sendo que tem jar que tem classes assim:
a.class
[code] public void c(){
///código …
Midlet.notifyDestroyed();
}[/code]
E desta maneira não tem como fazer as injections e não tem como criar uma aplicação que faça essas injections automaticamente.