Autore Topic: [facile] Creare ed eliminare una Status Bar Notification  (Letto 29364 volte)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
[facile] Creare ed eliminare una Status Bar Notification
« il: 01 Marzo 2010, 23:39:06 CET »
+9
Livello di difficoltà: facile
Versione SDK utilizzata: 4.2
Link al file compresso del progetto eclipse: file in allegato

In questo tutorial cercherò di spiegare come è possibile inviare una notifica alla Status Bar, ma prima un po' di teoria :)

La classe Notification mostra una notifica persistente all'utente tramite il NotificationManager.
Una Status Bar Notification aggiunge un'icona alla Status Bar di sistema (opzionalmente, accompagnata da un messaggio di testo a scomparsa) e un messaggio di testo esteso nella Notification window.
Quando l'utente seleziona il messaggio esteso, Android lancia un Intent che identifica la notifica (di norma lancia un'Activity).
È possibile personalizzare questa notifica aggiungendo suoni, vibrazione, lampeggio del led del dispositivo.

Un'Activity o un Servizio possono inizializzare la Status Bar Notification.
Poiché un'Activity per compiere delle azioni deve avere il focus, occorre delegare il lancio delle notifiche ad un servizio che opera in background, così da poterle inviare anche quando l'Activity principale non è direttamente utilizzata dall'utente (es: dispositivo in stato di sleep).

Per creare una notifica si devono utilizzare due classi: NotificationBuilder e NotificationManager.
Poichè la classe NotificationBuilder è stata introdotta nell'API level 11 (android 3.0) per garantire la retrocompatibilità utilizzeremo la classe NotificationBuilderCompat presente nella support library versione che, invece, è utilizzabile su Android a partire dalla versione 1.6. Assicuratevi quindi di avere la libreria android-support-v4.jar nella cartella libs del vostro progetto. In caso contrario, potete installarla facendo click destro sul nome del progetto -> "Android Tools" -> "Add Support Library".

Si usa un'Istanza di NotificationBuilder.Compat per definire le proprietà della status bar (icona, messaggio esteso e impostazioni extra).
Il NotificationManager è un servizio di sistema di Android che serve per eseguire e gestire le Notifications. È per questo necessario istanziare il Notification Manager.
Il collegamento tra Notification e NotificationManager viene implementato attraverso il metodo getSystemService() e, in seguito, quando occorre notificare qualcosa all'utente, si passa l'oggetto Notification tramite il metodo notify().

Ottieni un reference al  NotificationManager:
Codice (Java): [Seleziona]
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
Creazione della notifica tramite l'oggetto NotificationBuilder.Compat

Codice (Java): [Seleziona]
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                TutorialNotification.this);

// Titolo e testo della notifica
notificationBuilder.setContentTitle("Titolo della mia notifica");
notificationBuilder.setContentText("Testo della mia notifica");

// Testo che compare nella barra di stato non appena compare la notifica
notificationBuilder.setTicker("Questo è il tickerText");

// Data e ora della notifica
notificationBuilder.setWhen(System.currentTimeMillis());

// Icona della notifica
notificationBuilder.setSmallIcon(R.drawable.ic_stat_icon);

// Creiamo il pending intent che verrà lanciato quando la notifica
// viene premuta
Intent notificationIntent = new Intent(this, TutorialNotification.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);

notificationBuilder.setContentIntent(contentIntent);

// Impostiamo il suono, le luci e la vibrazione di default
notificationBuilder.setDefaults(Notification.DEFAULT_SOUND
                | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

Passaggio della Notification al NotificationManager:
Codice (Java): [Seleziona]
private static final int SIMPLE_NOTIFICATION_ID = 1;
mNotificationManager.notify(SIMPLE_NOTIFICATION_ID, notificationBuilder.build());

Se si è aggiunta la notifica tramite vibrazione occorre inserire il relativo permesso nell'AndroidManifest.xml:
Codice (XML): [Seleziona]
<uses-permission        android:name="android.permission.VIBRATE" />

E questo è tutto :)
Per maggiori dettagli (suoni, vibrazione, notifica led personalizzati, custom view) rimando alla documentazione ufficiale.

Sorgenti:
Codice (Java): [Seleziona]
package it.anddev.tutorialnotification;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.view.View;
import android.view.View.OnClickListener;

public class TutorialNotification extends Activity {

        private static final int SIMPLE_NOTIFICATION_ID = 1;
       
        NotificationManager mNotificationManager;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

                View btnSendSimpleNotification = findViewById(R.id.btnSendSimpleNotification);
                btnSendSimpleNotification.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                sendSimpleNotification();
                        }
                });

                View btnCancelNotify = findViewById(R.id.btnCancelNotification);
                btnCancelNotify.setOnClickListener(new OnClickListener() {

                        @Override
                        public void onClick(View v) {
                                cancelSimpleNotification();
                        }
                });
        }

        protected void cancelSimpleNotification() {
                mNotificationManager.cancel(SIMPLE_NOTIFICATION_ID);
        }

        private void sendSimpleNotification() {

                NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(
                                TutorialNotification.this);

                // Titolo e testo della notifica
                notificationBuilder.setContentTitle("Titolo della mia notifica");
                notificationBuilder.setContentText("Testo della mia notifica");

                // Testo che compare nella barra di stato non appena compare la notifica
                notificationBuilder.setTicker("Questo è il tickerText");

                // Data e ora della notifica
                notificationBuilder.setWhen(System.currentTimeMillis());

                // Icona della notifica
                notificationBuilder.setSmallIcon(R.drawable.ic_stat_icon);

                // Creiamo il pending intent che verrà lanciato quando la notifica
                // viene premuta
                Intent notificationIntent = new Intent(this, TutorialNotification.class);
                PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                                notificationIntent, 0);
               
                notificationBuilder.setContentIntent(contentIntent);

                // Impostiamo il suono, le luci e la vibrazione di default
                notificationBuilder.setDefaults(Notification.DEFAULT_SOUND
                                | Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

                mNotificationManager.notify(SIMPLE_NOTIFICATION_ID,
                                notificationBuilder.build());
        }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:gravity="center"
   android:orientation="vertical" >

    <Button
       android:id="@+id/btnSendSimpleNotification"
       android:layout_width="128dip"
       android:layout_height="wrap_content"
       android:text="Notifica semplice" >
    </Button>
   
    <Button
       android:id="@+id/btnCancelNotification"
       android:layout_width="128dip"
       android:layout_height="wrap_content"
       android:text="Elimina notifica" >
    </Button>

</LinearLayout>

AndroidManifest.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="it.anddev.tutorialnotification"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk
       android:minSdkVersion="4"
       android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.VIBRATE" />

    <application
       android:allowBackup="true"
       android:icon="@drawable/icon"
       android:label="@string/app_name" >
        <activity
           android:name="it.anddev.tutorialnotification.TutorialNotification"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

In android 4.1 sono stati introdotte le "rich notifications" che permettono di inserire nella notifica altri componenti, come ad esempio bottoni, immagini e progress bar. Il tutorial sul sito ufficiale di Android ha un ricco esempio a riguardo.

Per generare le icone per le notifiche potete utilizzare questo comodo tool: http://android-ui-utils.googlecode.com/hg/asset-studio/dist/icons-notification.html. Una funzione analoga è integrata nell'ADT, quindi comodamente dentro Eclipse potete fare "New" -> "Other" -> "Android Icon Set" -> "Notification Icons" e seguire il wizard.



Bibliografia:
« Ultima modifica: 04 Febbraio 2013, 15:03:52 CET da Ricky`, Reason: tutorial aggiornato per usare la classe NotificationCompat »
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Dado

  • Nuovo arrivato
  • *
  • Post: 33
  • Respect: +7
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Edges Labs
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #1 il: 22 Marzo 2010, 16:46:14 CET »
+3
Se posso permettermi, faccio una piccola aggiunta al seppur ottimo tutorial ;)
Oltre alle notifiche "classiche" presentate nel tutorial sono possibili notifiche che non presentano messaggi al loro interno (quindi nessun titolo, testo ed icona) le quali potrebbero essere utili in alcuni casi.
Per sfruttare queste notifiche bisogna usare un secondo costruttore disponibile, che non ha bisogno di nessun parametro:
Notification notif = new Notification();
In questo modo si può associare alla notifica le impostazioni sulla vibrazione, led e suono, senza dover visualizzare un messaggio di testo.
Includo un esempio
Codice (Java): [Seleziona]
NotificationManager nm = ( NotificationManager ) getSystemService( Context.NOTIFICATION_SERVICE );
Notification notification = new Notification();
notification.ledARGB = 0xff00ff00; //Colore verde, il più comune, ma sono disponibili molti altri colori
notification.flags = Notification.FLAG_SHOW_LIGHTS;
notification.ledOnMS = 100; //Durata LED accesso
notification.ledOffMS = 100; //Durata LED spento
nm.notify(LED_NOTIFICATION_ID, notification);

Codice per una notifica solo via led, oppure si potrebbe aggiungere la vibrazione o un suono in questo modo:

Codice (Java): [Seleziona]
notification.vibrate = new long[] { 200, 300, 200, 300 }; //Per una vibrazione personalizzata e non standard, richiede il relativo permesso android:name="android.permission.VIBRATE"

notification.sound = Uri.parse(sound); //Path della suoneria

Spero di non aver scritto cavolate :P

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #2 il: 22 Marzo 2010, 16:52:07 CET »
0
Ciao Dado, grazie per l'aggiunta :D.
In effetti ho scordato di inserire la parte relativa alle notifiche senza testo, fortunatamente hai colmato tu questa mancanza ;).
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline daniele

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #3 il: 26 Marzo 2010, 17:09:58 CET »
0
Grazieeeeeeeeee.

Offline acquariusoft

  • Utente normale
  • ***
  • Post: 157
  • Respect: +2
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Play Store ID:
    acquariusoft
  • Sistema operativo:
    Windows 7
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #4 il: 20 Maggio 2010, 10:05:24 CEST »
0
Ciao, quello che vorrei fare io è visualizzare un'icona sulla barra quando attivo qualcosa nel mio programma e lasciarla li finche non la disattivo, anche se l'utente cancella le notifiche.

Come posso fare?

grazie

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #5 il: 20 Maggio 2010, 12:31:11 CEST »
0
Questa flag dovrebbe essere quello che cerchi:
Codice (Java): [Seleziona]
notification.flags |= Notification.FLAG_ONGOING_EVENT;
Notification | Android Developers
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline acquariusoft

  • Utente normale
  • ***
  • Post: 157
  • Respect: +2
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Play Store ID:
    acquariusoft
  • Sistema operativo:
    Windows 7
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #6 il: 20 Maggio 2010, 14:21:35 CEST »
0
Grazie questi giorni sono molto occupato,appena posso provo e ti faccio sapere!!!


CIao

Offline acquariusoft

  • Utente normale
  • ***
  • Post: 157
  • Respect: +2
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Play Store ID:
    acquariusoft
  • Sistema operativo:
    Windows 7
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #7 il: 20 Maggio 2010, 14:42:36 CEST »
0
Allora funziona, il problema è che adesso la notifica rimane anche se chiudo l'applicazione, come faccio ad eliminarla alla chiusura?

Ciao
« Ultima modifica: 20 Maggio 2010, 14:46:26 CEST da acquariusoft »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #8 il: 20 Maggio 2010, 15:06:15 CEST »
0
Devi semplicemente cancellarla (guarda il tutorial per sapere come si fa) in uscita dal programma.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline acquariusoft

  • Utente normale
  • ***
  • Post: 157
  • Respect: +2
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Play Store ID:
    acquariusoft
  • Sistema operativo:
    Windows 7
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #9 il: 21 Maggio 2010, 09:47:52 CEST »
0
Grazie 100 funziona perfettamente

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #10 il: 31 Maggio 2010, 18:57:44 CEST »
0
Io avrei bisogno di fare in modo che l'activity che venga lanciata successivamente alla pressiona della notifica abbia questo comportamento:
-Se non è in esecuzione deve essere lanciata
-Se è già in esecuzione deve essere chiusa e lanciata questa nuova.

Qualcuno ha idee su come fare?

Offline dodopepper

  • Utente junior
  • **
  • Post: 124
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32a black
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #11 il: 07 Giugno 2010, 23:43:30 CEST »
0
ma la butto li, potresti giocare con i vari metodi onCreate onPause ecc e magari usare una variabile booleana di controllo così da poter avere la garanzia che l'istanza sia sempre "fresca" , oppure forse potrebbe bastare eliminare il saveIstanceState....non so, dovrei documentarmi meglio...lasciate che faccia questo esame e poi mi dedico completamente ad android :D

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #12 il: 08 Giugno 2010, 04:22:58 CEST »
+1
Io avrei bisogno di fare in modo che l'activity che venga lanciata successivamente alla pressiona della notifica abbia questo comportamento:
-Se non è in esecuzione deve essere lanciata
-Se è già in esecuzione deve essere chiusa e lanciata questa nuova.

Qualcuno ha idee su come fare?
PendingIntent | Android Developers

Offline dersew

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic 32A
  • Sistema operativo:
    ubuntu 10.04
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #13 il: 08 Giugno 2010, 17:47:20 CEST »
0
se volessi poi cliccare su una notifica, come faccio? cioè, quando clicco mi porta su una pagina nera, non nel mio main o ancor meglio sul mio "avvio.xml" ..

ah, e dato che c siamo..per far illuminare la trackball? :D

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #14 il: 08 Giugno 2010, 23:01:17 CEST »
0
PendingIntent | Android Developers

In realtà le flag da impostare nel PendingIntent mi sono utili solo in parte perchè non hanno effetto se l'activity che è già aperta e vorrei chiudere è stata aperta dal normale flusso di esecuzione dell'app e non dall'activity. Spero di essermi spiegato :)