segunda-feira, 13 de fevereiro de 2012

Android: Dicas 6

Olá povo,

Mais um post da série "Dicas de Android". Deixem suas sugestões para os próximos posts.

1 Instalar APK a partir da sua aplicação.
File apk = new File(
  Environment.getExternalStorageDirectory() + 
  "/Copas.apk");
Intent it = new Intent(Intent.ACTION_VIEW);
it.setDataAndType(Uri.fromFile(apk),
  "application/vnd.android.package-archive");
startActivity(it);

O código acima, carrega um arquivo (Copas.apk) que está na raiz do cartão de memória e dispara uma Intent que perguntará se o usuário deseja instalar a aplicação. Ao confirmar, a aplicação será instalada.

2. Criando arquivos no cartão de memória.
O código abaixo mostra como criar um diretório no cartão de memória do aparelho e depois cria um arquivo nesse diretório.
File meuDir = new File(
  context.getExternalFilesDir(null), "meuDir");
if (!meuDir.exists()) {
  meuDir.mkdir();
}

try {
 File arquivoTxt = new File(meuDir, "arquivo.txt");
 if (!arquivoTxt.exists()) {
   arquivoTxt.createNewFile();
 }
 FileOutputStream fos =
   new FileOutputStream(arquivoTxt);

 fos.write("Exemplo".getBytes());
 fos.close();
   
} catch (IOException e) {
 e.printStackTrace();
}


Adicione a permissão no AndroidManifest.xml
<uses-permission
 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Vale salientar que o código acima criará um diretório com o nome do pacote da aplicação na pasta Android que está na raiz do cartão de memória. Outro detalhe importante é que o arquivo será excluído caso a aplicação seja desinstalada.

3. Texto sublinhado ou strike no TextView
No editor visual do Android podemos alterar a propriedade android:textStyle para bold ou italic. Mas para o strike (como isso) ou sublinhado (como isso). Precisamos utilizar o código abaixo.
textView.setPaintFlags(
  textView.getPaintFlags() | 
  Paint.STRIKE_THRU_TEXT_FLAG);

O código acima, coloca o textView como strike. Para usar sublinhado, use a constante UNDERLINE_TEXT_FLAG da classe Paint.
Crédito dessa dica para Alvaro Cavalcanti.

4. Voltando para tela inicial da Activity
Digamos que você tem as Activities A, B, C e D. E da tela D você quer voltar pra A, faça o seguinte:
Intent it = new Intent(this, A.class);
it.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(it);

Essa chamada fará com que a Activity "A" seja re-criada, ou seja, o onCreate da mesma será chamado novamente. Para evitar isso, coloque no manifest, na declaração abaixo:
<activity
  android:name=".A"
  android:label="Primeira Activity"
  android:launchMode="singleTop"/>

Com isso, o método onNewIntent será chamado (ao invés do onCreate) e você poderá fazer algum tratamento lá baseado na nova Intent que está chegando.

5. Aumentando a memória disponível para aplicação
Estava trabalhando em uma aplicação Android para tablets que estava dando OutOfMemoryError. Após algumas investigações checamos que estávamos alocando muitas imagens, mas estávamos desalocando todas, ou seja, aparentemente tudo certo. Então nos deparamos com a propriedade abaixo:
<application
  android:largeHeap="true"
  ...>

Sem muita documentação, a propriedade acima, aumenta a memória da Dalvik (máquina virtual do Android) reservada para a aplicação, e para nós, funcionou.
Créditos para Andréa Santos (apesar dela não querer compartilhar informações) :D

6. Evitando cast no findViewById
Todo mundo que fez mais que um HelloWorld com Android, sabe que para obter a referência de um componente declarado em um arquivo de layout utiliza-se o método findViewById. Mas como esse método retorna um objeto da classe View (que é a superclasse de todos os componente visuais do Android) temos que fazer o cast para o componente desejado como abaixo:
Button b = (Button)findViewById(R.id.meuBotao);

Mas existe uma maneira de evitar esse cast utilizando o recurso de Generics do Java. Basta declarar o método abaixo na sua Activity.
@SuppressWarnings("unchecked")
private <T>T getViewById(int id){
  return (T)findViewById(id);
}

E para utilizar:
Button b = getViewById(R.id.meuBotao);

Economizamos aí alguns caracteres :) Créditos para Gustavo Pinto e José André Henrique.

Dúvidas ou sugestões? Deixem seus comentários.

4br4ç05,
nglauber

6 comentários:

Unknown disse...

Glauber,
também existe outro modo de sublinhar um texto onde você pode manipular os index de sublinhagem!

SpannableString contentUnderline = new SpannableString(num);
contentUnderline.setSpan(new UnderlineSpan(), START, END, 0);

Abraço.

Gui de Guinetik disse...

Lembrando ai que o largeHeap é Since: API Level 11, ou seja, somente para tablets :D

Emiliano Carvalho disse...

Glauber,

Estou estudando o Android e gostaria de saber como fazemos para criar uma aplicacao que nao tenha necessidade de abrir a tela. Tipo clicar num botao e ele tocar um mp3 ou um ringtone algo assim. Como vemos muitas aplicacoes o proprio player padrao vc pode tocar direito ou abrir a tela.

Ja sobre services mas nao consegui reproduzer esse exemplo.

Abraco

R.string.template_screen_off

Nelson Glauber disse...

Oi Emiliano,

É isso que você quer?

http://nglauber.blogspot.com.br/2012/01/widgets-service.html

4br4ç05,
nglauber

Pensando bem, acho que... disse...

private T getViewById(int id){
return (T)findViewById(id);
}

pow Glauber, credito pra quem?


pow Glaber!

[risos]

Nelson Glauber disse...

Pronto Zé Henrique... Mas com esse nick foi f0d4 de lembrar...

4br4ç05,
nglauber