Tutorial Android #21 – Notificações

Padrão

Olá pessoal! No último post vimos como utilizar alarmes em nossos aplicativos utilizando o AlarmManager. Porém, o alarme que definimos era exibido em tela cheia e, talvez, isso nem sempre é interessante. No tutorial de hoje, vamos adicionar a opção para o caso do usuário preferir uma notificação simples em vez de exibir ela em tela cheia.

O primeiro passo é adicionarmos mais essa opção no menu de opções. Assim, edite o arquivo preferencias.xml para adicionar um novo CheckBoxPreference.

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">    
	<ListPreference
	    android:key="listagem"
	    android:title="Modo de Listagem"
	    android:summary="Escolha o modo de listagem a ser utilizado"
	    android:entries="@array/nomes_ordenacao" 
		android:entryValues="@array/opcoes_ordenacao" 
		android:dialogTitle="Escolha o modo de listagem" />
	<CheckBoxPreference 
	    android:key="alarme"
	    android:title="Tocar Alarme no Almoço"
	    android:summary="Marque se deseja ser informado sobre a hora do almoço"/>
	<net.rafaeltoledo.restaurante.PreferenciaHorario
	    android:key="horario_alarme"
	    android:title="Horário do Alarme do Almoço"
	    android:defaultValue="12:00"
	    android:summary="Configure seu horário desejado para o alarme"
	    android:dependency="alarme"/>
	<CheckBoxPreference 
	    android:key="usar_notificacao"
	    android:title="Ativar Notifocação"
	    android:defaultValue="true"
	    android:summary="Marque caso deseje um ícone na barra de status, ou desmarque para a notificação em tela cheia"
	    android:dependency="alarme"/>
</PreferenceScreen>

Por fim, vamos editar o método onReceive da classe ReceptorAlarme para realizar a exibição da notificação, caso esta opção esteja selecionada.

@Override
public void onReceive(Context context, Intent intent) {
	SharedPreferences preferencias = PreferenceManager.getDefaultSharedPreferences(context);
	boolean usarNotificacao = preferencias.getBoolean("usar_notificacao", true);
		
	if (usarNotificacao) {
		NotificationManager gerenciador = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
		Notification nota = new Notification(R.drawable.notificacao, "Hora do Almoço!", System.currentTimeMillis());
		PendingIntent i = PendingIntent.getActivity(context, 0, new Intent(context, AlarmeActivity.class), 0);
		nota.setLatestEventInfo(context, "Lista de Restaurantes", "Hora do Almoço! Está com fome?", i);
		nota.flags |= Notification.FLAG_AUTO_CANCEL;
		gerenciador.notify(ID_NOTIFICACAO, nota);
	} else {		
		Intent i = new Intent(context, AlarmeActivity.class);
		i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);		
		context.startActivity(i);
	}
}

Para essa operação, será necessário adicionarmos um atributo na classe, que é basicamente um número único para diferenciar esta notificação de outras que, eventualmente, venhamos utilizar em nosso aplicativo.

O ícone referenciado no aplicativo é o ícone de notificação do GTalk, que pode ser obtido no diretório de instalação da SDK sob o nome de stat_notify_chat. Caso deseje utilizar outro, fique à vontade.

E pronto! Já temos nosso aplicativo funcionando. Configure o alarme e realize seus testes.

Como de costume, para baixar o projeto, basta clicar aqui. Até logo! 🙂

  • Bom dia,

    Dentro deste código existe alguns problemas quanto à compilar e emular.
    Erro no FormularioDetalhes.java:

    35 – idRestaurante = getIntent().getStringExtra(ListaRestaurantes._ID);
    (._ID)

    71 – gerenciador.atualizar(idRestaurante,…
    (.atualizar)

    82 – Cursor c = gerenciador.obterPorId(idRestaurante);
    (.obterPorId)

    Fico grato se possível dar uma indicação para resolver esses problemas.
    Além disso, gostaria de modificar este código para criar a partir deste formulário um arquivo em xml, ou seja, exportar o arquivo para a memória local, se você puder me dar uma luz nisso também agradeço.

    Deste já, agradeço atenção.
    Uilque Neuton.

    • Certo… mas qual erro está apontando? Você colocou aí as linhas que tá acusando, mas não o erro… :/

  • Carlos Noster

    olá Rafael eu trabalhei em cima de um tutorial que mostrava como mostrar os bytes recebidos e enviados e então implementei para medir a velocidade de conexão da internet movel 2G/3G/4G para celulares a partir da versao 2.3 gingerbread.

    agora gostaria de mostrar estes valores obtidos com o aplicativo na barra de status quando inicializar o aplicativo.e quando fechar o aplicativo apagar da barra os mesmos. seriam o DownSpeed e o UPspeed.voce poderia me ajudar?

    obrigado.