DevCorner

DevCorner: impariamo ad utilizzare le notifiche

Giuseppe Tripodi -

Puntuale come una notifica quando ricevete un SMS, arriva anche questa settimana Dev Corner, la rubrica che vi guida tra i meandri della programmazione Android con semplici guide. Per questo appuntamento parleremo, appunto, delle notifiche e di come generarle.

Nel codice finale scaricabile dal forum troverete il risultato dell’ormai martoriata Hello(Android)World, app d’esempio che abbiamo iniziato a realizzare qualche settimana fa per i nostri tutorial: andremo ad aggiungere un bottone per lanciare la notifica ed aggiungere il metodo per crearla.

Per prima cosa, quindi, apriamo l’XML di activity_main e definiamo un tasto con id “notifica” e un testo richiamando una stringa con la scritta Notifica: il risultato finale dovrebbe essere qualcosa di simile:

   
<Button
android:id="@+id/notifica"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notifica"
android:layout_below="@+id/chiudi"
android:layout_alignRight="@+id/chiudi"/>

Adesso viene la parte più divertente, quella del codice: apriamo MainActivity.java e nell’OnCreate definiamo il bottone, richiamandolo tramite l’ID: una volta creato, assegnamogli un OnClickListener al quale collegheremo un metodo per lanciare la notifica:

Button notifica = (Button) findViewById(R.id.notifica);
notifica.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
creaNotifica(view);
}
});

A questo punto scriviamo il metodo creaNotifica: qui andiamo a definire l’aspetto della nostra Notifica, impostando Titolo, Immagini e testo da mostrare (sia per la versione contratta che espansa); inoltre, stabiliamo adesso anche le azioni che devono essere eseguite al click della notifica. Iniziamo proprio con questo punto, scrivendo due Intent(ve li ricordate?): il primo che mandi alla seconda Activity dell’applicazione e l’altro che avvii il dialer del telefono e, per ognuno di essi, creiamo anche un PendingIntent, oggetto che altro non fa che “tener pronto” l’intent per essere avviato.

Intent intent1 = new Intent(this, SecondActivity.class);
PendingIntent pending1 = PendingIntent.getActivity(this, 0, intent1, 0);

Intent intent2 = new Intent(Intent.ACTION_DIAL, null);
PendingIntent pending2 = PendingIntent.getActivity(this, 0, intent2, 0);

Adesso è il momento di creare un oggetto di tipo Notification Builder, impostando i diversi metodi:

  • .setContentTitle, impostiamo qui il titolo della notifica
  • .setContentText, impostiamo qui il testo della notifica contratta
  • .setSmallIcon, settiamo qui l’immagine, da richiamare tra i drawable
  • .setStyle, con questo metodo andiamo a definire il testo della notifica espansa: per farlo, non abbiamo scritto direttamente il testo qui ma abbiamo definito una stringa chiamata “testo_notifica”, che abbiamo successivamente richiamato con i metodi getResourString()
  • .setContentIntent, con questo metodo definiamo quale intent deve venire lanciato al click della notifica
  • .addAction, scriviamo qui la prima delle due azioni previste, passandogli un’immagine, il testo da mostrare e l’intent che deve essere lanciato
  • .addAction, come su, ma per la seconda azione
  • .build, serve effettivamente a “costruire” la notifica

 

Abbiamo praticamente finito: dopo aver richiamato il Notification Manager di Android così:

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

possiamo, a nostra discrezione, inserire anche questa riga per fare in modo che la notifica venga automaticamente cancellata quando ci si clicca su:

provaNotifica.flags |= Notification.FLAG_AUTO_CANCEL;

Infine, mostriamo la notifica richiamando il NotificationManager e passandogli il nome della nostra notifica (ad esempio provaNotifica):

notificationManager.notify(0, provaNotifica);

Il risultato finale del metodo creaNotifica sarà qualcosa di simile:

public void creaNotifica(View view) {
//Definiamo i due intent da lanciare
Intent intent1 = new Intent(this, SecondActivity.class);
PendingIntent pending1 = PendingIntent.getActivity(this, 0, intent1, 0);

Intent intent2 = new Intent(Intent.ACTION_DIAL, null);
PendingIntent pending2 = PendingIntent.getActivity(this, 0, intent2, 0);

// Chiamiamo il Notification Builder e settiamo titolo, testo, testo con notifica espansa e gli intent da lanciare
Notification provaNotifica = new Notification.Builder(this)
.setContentTitle("Titolo")
.setContentText("Notifica di prova")
.setSmallIcon(R.drawable.ic_launcher)
.setStyle(new Notification.BigTextStyle().bigText(getResources().getString(R.string.testo_notifica)))
.setContentIntent(pending1)
.addAction(R.drawable.ic_launcher, "Lancia", pending1)
.addAction(R.drawable.ic_launcher, "Chiama", pending2)
.build();
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//Cancella la notifica automaticamente quando cliccata
provaNotifica.flags |= Notification.FLAG_AUTO_CANCEL;

//Avvia la notifica
notificationManager.notify(0, provaNotifica);

}

A proposito della possibilità di espandere la notifica, come sicuramente ricorderete questa funzionalità è stata introdotta con Android 4.1, quindi, qualora non fosse già così, dovrete modificare  l’AndroidManifest.xml inserendo come versione minima dell’SDK la 17.

 

Non ci riamane che avviare l’app sul nostro telefono per testare la nostra bellissima (eufemismo!) notifica, che dovrebbe apparire più o meno come le immagini di seguito.

NotificaNotifica_espansa

Come sempre ricordiamo che, purtroppo, potreste incappare in diversi problemi (specialmente se siete alle prime armi!) e in tal caso vi rimandiamo sempre al nostro forum nella sezione Sviluppo, dove potrete chiedere tutto il supporto che volete e scaricare l’intero codice dell’app.
Buon sviluppo a tutti!