Application Class no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /Application Class no Android, Entendendo e Utilizando

Application Class no Android, Entendendo e Utilizando

Vinícius Thiengo
(7427) (9)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas
CategoriaEngenharia de Software
Autor(es)Gene Kim, Jez Humble, John Willis, Patrick Debois
EditoraAlta Books
Edição
Ano2018
Páginas464
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Tudo bem?

Na vídeo aula acima iremos estudar, passo a passo, uma importante classe no Android, mais precisamente a classe Application.

Está é a "classe processo", pois ela é instanciada assim que o aplicativo é acionado e somente uma instância dela permanece em memória enquanto o aplicativo esta em execução, em foreground (primeiro plano) ou em background (segundo plano).

Provavelmente deve ter passado em sua mente que se a classe Application é de única instância no app quando em execução, então é possível obter todos os dados de sistema relativo ao aplicativo dela, certo?

Quase isso. Todos os dados é "muita coisa", mas algumas informações importantes é sim possível obter, como, por exemplo, o estado atual do consumo de memória do dispositivo.

Mas confesso que a Application class nem é muito utilizada para isso. Na verdade, para inúmeras APIs, até mesmo APIs nativas, é na instância única da Application class que se dá o "start" na API cliente.

Uma popular API que necessita do trabalho na Application é a OneSignal API.

Ou seja, essa instância única é muitas vezes utilizada como uma espécie de Singleton em projetos de aplicativos Android.

Ok, Thiengo. Mas isso não esta errado? Aparentemente fere a ideia de código organizado, código limpo🤔

Na verdade eu não vejo problema algum em utilizar, vez ou outra, a instância da classe Application para um código Singleton, principalmente para APIs que necessitem de entidades, instâncias, únicas atendendo a todo o projeto: atividades, fragmentos, caixas de diálogo, widgets, e so on.

O problema é generalizar, banalizar, a Application.

Como assim generalizar? 🙄

Sempre que precisar de uma instância única em projeto, partir para a Application class. Não precisa disso.

Sem sombra de dúvidas que o primeiro passo deve sim ser a verificação da possível modularização do código, ou seja, se é possível manter o código Singleton dentro da própria classe que deverá ter a instância única, então mantenha na classe e não em uma subclasse de Application.

Thiengo, subclasse de Application? Agora me confundi.

É isso mesmo. Quando é preciso utilizar a instância única da classe Application, nós desenvolvedores temos na verdade é que criar uma subclasse dela e logo depois de definir o código necessário, devemos então configura-la no AndroidManifest, caso contrário a instância de nossa subclasse de Application nunca será criada.

A seguir um simples exemplo da configuração de uma subclasse de Application no AndroidManifest.xml. Aqui essa subclasse tem o rótulo CustomApplication:

<?xml version="1.0" encoding="utf-8"?>
<manifest
...>

<application
...
android:name=".CustomApplication">
...
</application>
</manifest>

 

Antes que você prossiga para a vídeo aula que tem um exemplo completo e que você deve assistir principalmente se é um desenvolvedor iniciante no Android (caso contrário tem grandes chances de você não utilizar algumas APIs de terceiros, por exemplo, somente porque não entende a Application class).

Antes disso, preciso solicitar ainda mais atenção às APIs de acesso a dados de memória, APIs que a classe Application provê:

O método onLowMemory(), para Android API 13, Honeycomb, e inferior, e o método onTrimMemory(), para Android API 14, Ice Cream Sandwich, e superior.

Estes dois métodos são invocados pelo sistema quando a memória geral do dispositivo começa e ficar sem espaço. É isso mesmo, a memória geral e não o espaço de memória destinado ao seu aplicativo.

Com o problema de espaço de memória identificado pelo sistema, o Android informa às aplicações, que estão tanto no foreground quanto no background, qual o estado dela, a aplicação, quanto a possibilidade de ser removida ou não da memória para liberar espaço para processos de prioridade maior.

O Android nos dá algumas constantes de comparação para verificar o estado da aplicação quanto a possibilidade de ser removida.

Mas a documentação deixa claro que não devemos adotar a comparação exata com essas constantes, pois os valores de entrada do método (no caso somente o método onTrimMemory()) podem vir entre os valores das constantes.

Neste caso a documentação oficial do Android recomenda que a comparação seja realizada na forma que: se o valor for igual ou maior que o de uma determinada constante, então que o bloco condicional referente a essa constante em comparação seja o bloco executado.

O método onLowMemory() é chamado apenas quando o estado da aplicação quanto a possibilidade de ser removida da memória é a mais alta, ou seja, igual a constante TRIM_MEMORY_COMPLETE.

Note que se você estiver tendo sérios problemas de OutOfMemoryException e já tiver tentado inúmeros algoritmos e o problema ainda persiste, então a instância única da classe Application pode sim ser ao menos o início da solução definitiva, isso devido a possibilidade de acesso a dados que indicam problemas de falta de espaço em memória.

Se você realmente se encontrar nessa situação, problemas críticos de consumo de memória, então eu também recomendo que você "destrinche" a seguinte página da documentação oficial: ComponentCallbacks2.

Antes de finalizar, abaixo deixo alguns importantes links de outros artigos aqui do Blog, acompanhados de seus respectivos vídeos, que lhe colocarão em dia com o que há de novo no desenvolvimento de apps Android:

E caso você tenha o desejo de aprender a desenvolver apps Android, ou apenas evoluir nesta área, também com o conteúdo gratuito do Blog, então não deixe de acessar a lista exclusiva de estudos em: Estudando Android - Lista de Conteúdos do Blog.

E também não esqueça de se inscrever 📫 na lista de e-mails do Blog para receber, em primeira mão, os conteúdos exclusivos de desenvolvimento Android.

Se inscreva também no canal do Blog no YouTube para acompanhar as últimas novidades, em vídeo, liberadas lá.

Surgindo dúvidas ou dicas, pode enviar abaixo na área de comentários que logo eu lhe retorno.

Obs. 1: o link para download do projeto apresentado em vídeo se encontra logo abaixo no artigo, na seção "Download".

Abraço.

Eclipse IDE vs Android Studio IDE

Apesar de o conteúdo em vídeo aula estar utilizando o IDE Eclipse 😱, tudo que é apresentado, tanto a parte teórica quanto a parte prática, é ainda válido nos dias de hoje com o desenvolvimento Android utilizando o Android Studio IDE 😁.

Ou seja, independente da linguagem oficial (Java, Kotlin, C ou C++), IDE ou framework que você esteja utilizando, o conteúdo acima é ainda muito válido.

Fontes

Application - documentação oficial Android

ComponentCallbacks2 - documentação oficial Android

Visão geral dos processos e threads

Histórico de versões do Android

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

Pacote Google Play Services Ads Para Anúncios no AndroidPacote Google Play Services Ads Para Anúncios no AndroidAndroid
Google Cloud Messaging (GCM) no AndroidGoogle Cloud Messaging (GCM) no AndroidAndroid
Google Plus API no Android, Realizando LoginGoogle Plus API no Android, Realizando LoginAndroid
Compartilhamento e Lista de Usuários Com Google Plus API no AndroidCompartilhamento e Lista de Usuários Com Google Plus API no AndroidAndroid

Compartilhar

Comentários Facebook

Comentários Blog (9)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Rafael Mota (1) (0)
24/07/2018
Tudo bem Thiengo? Eu tenho um app que uso Application Class para "armazenar" a URL de um web service. Uso o retrofit para se comunicar com o WS. Tenho a seguinte interface :

public interface MyRetrofit {  

    public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://multsistem.ddns.com.br ")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

Como faço pra passar a URL que está na Application Class para essa interface?
Responder
Vinícius Thiengo (0) (0)
31/07/2018
Rafael, tudo bem?

No caso estou assumindo que a sua necessidade é colocar a url armazenada na classe Application no lugar da url http://multsistem.ddns.com.br/ , certo?

Sendo assim, assumindo que a url na Application está armazenada como uma entidade pública de classe (dado estático) você poderia fazer algo como:

...
.baseUrl( NomeDaApplicationClass.urlArmazenada )
...

O dado estático urlArmazenada é do tipo String. Assim você terá o fácil acesso a url armazenada.

Abraço.
Responder
Anderson (0) (0)
24/10/2014
Ola. muito bom seu video mano, Thiengo to tentando desenvolver um projeto android mas esta acontecendo uns erros estranhos no meu eclipse, tipo o "file explorer" não carrega nada, o emulador abre direitinho mas o file explorer sempre fica vazio, antes não tava assim eu startava o emulador e o file explorer carregava as pastas dele, mas de uns dias pra ca ta dando esse problema e eu nao consigo resolver, vc sabe dizer o que é e se isso ja aconteceu com vc? Vlw cara abraços.
Responder
Vinícius Thiengo (0) (0)
26/10/2014
Fala Anderson, blz?
Não lembro de ter tido esse problema não, vc está selecionando o seu emulador em "Devices"? Fez alguma atualização no Eclipse? Se não, atualize ele e o SDK tb, se possível. Abraço
Responder
wiliam (0) (0)
20/10/2014
Oi Thiengo tudo bom? Cara vc sabe algum metodo para diminuir o tamanho de arquivos muito grandes? To tentando enviar videos para o servidor mas os aquivos são muito grandes e eu não consigo converter eles para string usando o Base64, ele da pau quando eu tento converter, ai to querendo ver se eu consigo diminuir o tamanho dos bytes pra ver se consigo converter pra string, queria saber se vc sabe alguma forma de fazer isso com videos e musicas, desde já agradeço pela ajuda valeu!
Responder
Vinícius Thiengo (1) (0)
20/10/2014
Fala Wilian, blz?
Dê uma olhada nesse discussão do stakeoverflow (http://stackoverflow.com/questions/11275423/send-image-and-videos-files-from-android-to-a-server-and-receive-processed ) e depois olhe esse link (http://7labs.heypub.com/mobile/compress-video-android-ios-wp.html )... olhe o que essa App faz com o tamanho do vídeo file. Abraço
Responder
wiliam (0) (0)
22/10/2014
Cara achei um código aqui q parece ser bom, ele envia os dados pro servidor usando um Dataoutputstream  mas ele ta me dando erro de syntax nessa linha aqui (~~> dos.writeBytes("Content-Disposition: form-data; name="uploadedfile";filename="" + selectedPath + """ + lineEnd); <~~ ) vc sabe me dizer o que pode ser eu nao sei muito bem trabalhar com esse Dataoutputstream
Responder
Vinícius Thiengo (1) (0)
22/10/2014
Fala Wiliam, blz?
Ve se assim vai:

dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + selectedPath + "\"" + lineEnd);

Abraço
Responder
Willam (2) (0)
23/10/2014
Rsrs cara vc é foda! agora sim funcionou, do jeito que o cara tinha feito tava dando erro de syntax, como eu nao conheço muito o DataOutputstream eu fiquei meio que sem saber o que fazer, mas ainda bem que existe blogs perfeitos como o seu para nos dar um apoio, Valeu cara!
Responder