abril 04, 2013

Tutoriais | Porque meus aplicativos não fecham?

Bom pessoal para responder a pergunta “Porque meus aplicativos não fecham”, eu vou fazer mais algumas perguntas.  Você não precisa ler a pergunta e já ler a resposta. Tome um tempo para pensar, e depois leia a resposta. Vamos lá aos poucos,  e espero que no final de tudo vocês entendam porque o Android não tem o botão fechar em seus aplicativos (apesar de alguns implementarem). Vamos iniciar falando de um computador normal.





A memória RAM funciona (tem o comportamento) igual ao processador?


Não, programas abertos compartilham recursos do aparelho, entre eles o processador e a memória RAM. Na memória RAM ficam todos os aplicativos que foram iniciados e no processador fica somente um aplicativo de cada vez. Um usuário pode sentir o computador “lento” por que está fazendo SWAP (usando memória virtual no disco e fazendo a troca dos apps nela para a RAM) ou porque os programas abertos estão querendo/precisando usar por muito tempo o processador, mas lá so cabe um processo de cada vez. Logo, quanto mais programas abertos, mais vai demorar para alternar entre eles.

Qual é a coisa mais irritante que existe no seu computador quando você quer abrir um programa? 

Esperar! Esperar alguns, ou vários, segundos para ele abrir. Esses segundos são uma eternidade, não é?! O que mais queremos é um computador melhor para abrir as coisas mais rápido, processar as coisas mais rápido.

E porque temos que esperar? 

O processo de abrir um programa explicado simplificadamente é: o sistema operacional tem que copiar os dados principais que o programa usa para a memória RAM, que é bem mais rápida que o HD. Isso é da arquitetura do computador, e um programa para ser utilizado precisa que os códigos a serem usados no momentos estejam na RAM. Caso um programa fosse ser utilizado direto do HD o tempo de respostas seria muito mais demorado.

E o que acontece se você abre um programa tipo o Photoshop,
Firefox ou um jogo pesado no seu computador, fecha o programa e depois quer abrir de novo?
 

Tem que ficar esperando de novo! Como o programa foi fechado, o SO tira ele da memória para que outros programas possam ser utilizados. Isso faz com que quando você for abrir de novo, o SO tenha que refazer o fluxo de pegar os dados do HD e passe para a RAM. Esse é um dos motivos do Photoshop e vários outros programas usarem abas atualmente. É mais fácil carregar apenas a imagem nele, do que reabrir o programa inteiro apenas para mexer em uma imagem, sabendo disso, vamos falar de Android…

Podemos dizer que o Android foi feito na mesma ideia do Google Docs. Você não precisa salvar, o documento é salvo automaticamente. Aqui no caso você não precisa fechar, o aplicativo é fechado automaticamente quando o Android precisar. Ele foi feito assim por questões de desempenho que vou explicar abaixo.


O que o Android faz para contornar esse problema de ter que ficar esperando abrir programas? 

Quando você abre o programa pela primeira vez, não tem jeito, pode (e vai) demorar um pouco para abrir o programa, mas é o tempo normal dele ser iniciado no aparelho. No entanto quando o programa perde o foco, seja por você ter apertado o botão Home, seja por outra coisa ter entrado em cima dele (como uma ligação) ou porque você ficou apertando voltar até ele fechar, o Android SO coloca seu programa para dormir. Assim como você pausa um jogo o seu app é pausado. Ele continua na RAM do aparelho mas não acessa mais o processador, a não ser que o app esteja realmente fazendo algo em background (como o navegador abrindo uma página).


Quando você realmente precisa fechar um programa? 

É bem difícil você ter que fechar um programa. Programas na memória RAM são programas que você acessa mais rápido, por não ter que fazer o ciclo de busca no HD e traz pra RAM. Por isso os aplicativos que não estão com foco ficam no stand-by. Por exemplo, em um player de audio ou de vídeo você não precisa fechá-lo. Você pode dar um pause e deixar ele quietinho e ir fazer alguma outra coisa. O que ocorre é que somos mal acostumados pelo SO de Desktop a ficar fechando aplicativos quando não usamos. Qualquer coisa que vá contra isso parece esquisito e ruim (só ver quem gostou da Unity do novo Ubuntu). É um paradigma diferente, e algo diferente já tem bloqueio na mente, a ideia de ter que fechar um programa em SO Desktop é (entre outras coisas, já que o Windows não fecha um programa sozinho… não sem dar erro) para não ficar com uma barra de tarefas super lotada, o que é visualmente incômodo. Você não precisa se preocupar em fechar apps no Android SO. Ele vai fechar para você se o app não estiver fazendo mais nada. Faça um teste. Abra um jogo, depois sai dele apertando Home. Abra outro jogo pesado e depois saia dele apertando Home. Quando você voltar para o primeiro jogo, se estiver com um aparelho que não tem tanta RAM assim, vai ver que o jogo inicia desde o começo. Ele estava na RAM, mas seu estado voltou ao inicial pois um outro app pediu a parte de memória que eles tinha pego, entrando um pouco mais a fundo em como isso ocorre: o app é notificado que vai ser morto e tem um tempo para salvar seu estado e “sumir da memória”. Com isso um jogo pode voltar ao estado que estava antes, ou pode fechar e ter que começar de novo. A última opção é a mais normal atualmente.


Memória RAM não é infinita, um dia ela vai ficar “cheia” de aplicativos abertos, mas… O que é um programa aberto? 

É um programa que está carregado (copiado) na memória RAM do aparelho e que, de tempos em tempos, acessa o processador. Normalmente esse tempo é tão pequeno que não percebemos que ele (o app) está competindo pelo direito de usar o processador com outros programas, a grande sacada do Android é que se tem memória RAM livre, ele deixa os programas usarem, afinal ela foi feita para isso mesmo! Se a memória RAM livre está acabando, o Android pega um dos programas que estão dormindo e fecha ele. E esse fechar não é igual um kill. Quando um programa é notificado pelo Android que precisa ser fechado ele tem um tempo para salvar seus dados e sair da memória. O kill simplesmente fecha o programa e pouco importa como estão os dados. Por isso falamos que um task killer não é importante para um smartphone.


Mas matar o programa não é uma coisa perigosa? Eu poderia perder dados com isso? 

Aí depende do app e de quem desenvolveu o programa. Se o desenvolvedor foi atencioso no desenvolvimento do app, ele fez algo como: “Meu querido programaminha, quando o Android te colocar para dormir, salve todos os seus dados importantes tá bom? Quando o Android te acordar desse soninho gostoso, você volta a executar de onde parou usando aqueles dados, tá legal?”

Quando o Android mata um programa que está “dormindo”, não deveria haver problemas. Mas pode acontecer caso o desenvolvedor não tenha dito para o filho dele programa se cuidar. E essa perda de dados ocorreria da mesma forma se o app ou o Android tevesse o botão de fechar caso o desenvolvedor não dissesse: “Querido programinha, quando o usuário apertar o botão fechar, salve seus dados importante, e então entramos no assunto Task Killer (ou Task Managers) que é o famoso Ctrl + Alt + Del do Windows. Eles vão mostrar uma lista de aplicativos que estão rodando, aí você acha que esses aplicativos estão consumindo algo que não deveria e sai matando um monte. Ou pior ainda, usa o Auto Killer, para quando o app perder o foco que ele mate o app. Sabe o que ocorre? O aplicativo não tem tempo de salvar os dados necessários e você perder algumas informações importantes, ou o sistema não deixa o app ser morto pelo Task Killer, e fica essa briga de mata-não-mata, o que acaba consumindo processamento e seu aparelho fica mais lento pra fechar aplicativos do que para abrir, e falando ainda mais sobre Task Killers, alguns mostram uns apps que você nem abriu rodando. E não são os apps, são alguns serviços dos Apps. Por exemplo o Maps. Ele fica lá rodando em background, mas você nunca abriu. O porque disso? Poder ser que você esteja com o Latitude aberto, ou que tenha pedido para o Android saber sua localização, ou qualquer outra coisa que tenha a ver com isso. No caso não é o aplicativo Maps que está aberto, e sim um serviço do Maps que está sendo executado, ou no caso, guardado para ser executado em algum momento. E matar um serviço desse pode levar o aparelho a um estado inconsistente, dizendo para si mesmo “Cadê o serviço que estava aqui? Acho que vou ter que abrir de novo.”

Ok, Ok, entendi tudo até aqui, mas e se eu quiser realmente matar um aplicativo? 

Se você leu tudo e entendeu os riscos, mas acha que pode acelerar seu aparelho, ou apenas quer deixar ele mais limpo, existem alguns métodos nativos do Android para isso:


O primeiro é com o botão voltar. Você vai apertando voltar no aplicativo até a página inicial do aplicativo e apertar Voltar novamente. Ele vai ficar voltando a seu estado anterior sempre até chegar no estado inicial, e quando você apertar Voltar novamente ele fecha. Esse é um método. Outro método é que alguns aplicativos tem uma opção fechar dentro do Menu deles.Realmente funciona, o aplicativo não vai mais ocupar sua RAM nem seu processador, e você vai se sentir aliviado. No entando você não deu um Force Close nele, apenas fechou fazendo com que ele salvasse o que tinha que salvar, agora se um aplicativo travou e você precisa fechar mesmo, você pode ir até Configurações – Aplicativos – Gerenciar aplicativos. Só para você ter uma ideia de como essa questão é importante e delicada, desde o 2.1 essa tela sempre muda. Se você estiver usando um aparelho até o Eclair (2.1) você vai apertar Menu – Filtro – Em Execução. Se estiver no FroYo (2.2) ou Gingerbread (2.3), existe uma aba específica. E no Gingerbread ainda, você pode acessar essa tela direto da sua Home Screen apenas apertando Menu, e ele ainda mostra algumas informações a mais como quanto de RAM tem live. Ou seja o assunto é delicado e importante. Mas duvido muito que o Android tenha um botão fechar em algum momento. É mais fácil deixar que o SO cuide disso para você. Voltando… Depois que você listou os aplicativos em execução você aperta em um e usa a opção Forçar Fechamento (Force Close). Acabou, seu aplicativo foi retirado da memória.

Acabo aqui o que tinha para falar, e deixo uma mensagem: Um aplicativo que é morto/fechado vai levar o mesmo tempo para abrir que da primeira vez. Então alguns aplicativos não vale a pena matar. O que falo é que deixe de lado esse negócio de Task Killer, e deixe que o Android resolva quais aplicativos podem ser mortos ou não. De tempos em tempos, se quiser deixar tudo mais limpo use as opções nativas do sistema, ou as opções nativas do seu aparelho (sei que alguns aparelhos vem com Task Manager, como o Galaxy S e o Milestone 2). E se você está vendo que um aplicativo está sempre usando demais o que não necessita, acho que está na hora de pegar um outro aplicativo. Algo a ser notado também é que a soma do uso da CPU dos apps em background não é maior que 10%. Isso faz com que aplicativos mal comportados não usem o que não precisam.

Nenhum comentário:

Postar um comentário