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

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1590
  • Respect: +196
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus w/ CM9
  • Market Developer Name:
    Roberto Leinardi
  • Sistema operativo:
    Ubuntu 11.10
[facile] Creare ed eliminare una Status Bar Notification
« il: 01 Marzo 2010, 23:39:06 CET »
+3
Livello di difficoltà: facile
Versione SDK utilizzata: 1.6
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: Notification e NotificationManager.
Si usa un'Istanza di Notification 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]
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);

Inizializzazione del Notification:
Codice (Java): [Seleziona]
int icon = android.R.drawable.stat_notify_chat;
CharSequence tickerText = "Questo è il tickerText";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);

Definizione del messaggio esteso della notifica e del relativo Intent:
Codice (Java): [Seleziona]
Context context = getApplicationContext();
CharSequence contentTitle = "Titolo della mia notifica";
CharSequence contentText = "Testo della mia notifica";
Intent notificationIntent = new Intent(this, TutorialNotification.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);

Aggiungere alla notifica del suono di default, la vibrazione di default e il lampeggio del LED di default (opzionale):
Codice (Java): [Seleziona]
notification.defaults |= Notification.DEFAULT_SOUND;    //Suona
notification.defaults |= Notification.DEFAULT_LIGHTS;   //LED
notification.defaults |= Notification.DEFAULT_VIBRATE;  //Vibra

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

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:
TutorialNotification.java
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.view.View;
import android.view.View.OnClickListener;

public class TutorialNotification extends Activity implements OnClickListener {
        private static final int NOTIFICATION_ID = 1;
        NotificationManager mNotificationManager;
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                // Inizializzo i click listeners per tutti i pulsanti
                View btnSendNotify = findViewById(R.id.btnSendNotify);
                btnSendNotify.setOnClickListener(this);
                View btnEraseNotify = findViewById(R.id.btnEraseNotify);
                btnEraseNotify.setOnClickListener(this);
        }
        @Override
        public void onClick(View v) {
                switch (v.getId()) {
                case R.id.btnSendNotify:
                        String ns = Context.NOTIFICATION_SERVICE;
                        mNotificationManager = (NotificationManager) getSystemService(ns);
                       
                        int icon = android.R.drawable.stat_notify_chat;
                        CharSequence tickerText = "Questo è il tickerText";
                        long when = System.currentTimeMillis();
                        Notification notification = new Notification(icon, tickerText, when);
                       
                        Context context = getApplicationContext();
                        CharSequence contentTitle = "Titolo della mia notifica";
                        CharSequence contentText = "Testo della mia notifica";
                        Intent notificationIntent = new Intent(this, TutorialNotification.class);
                        PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
                        notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
                       
                        notification.defaults |= Notification.DEFAULT_SOUND;    //Suona
                        notification.defaults |= Notification.DEFAULT_LIGHTS;   //LED
                        notification.defaults |= Notification.DEFAULT_VIBRATE;  //Vibra


                        mNotificationManager.notify(NOTIFICATION_ID, notification);

                        break;
                case R.id.btnEraseNotify:
                        if(mNotificationManager != null){
                                mNotificationManager.cancel(NOTIFICATION_ID);
                        }
                        break;
                }
        }
}

main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center">
        <Button
                android:layout_height="wrap_content"
                android:text="Invia Notifica"
                android:id="@+id/btnSendNotify"
                android:layout_width="128dip"></Button>
        <Button
                android:layout_height="wrap_content"
                android:text="Elimina notifica"
                android:id="@+id/btnEraseNotify"
                android:layout_width="128dip"></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">
        <application
                android:icon="@drawable/icon"
                android:label="@string/app_name">
                <activity
                        android:name=".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>
        <uses-sdk
                android:minSdkVersion="4" />
        <uses-permission
                android:name="android.permission.VIBRATE" />
</manifest>

Bibliografia:
« Ultima modifica: 09 Marzo 2010, 23:29:25 CET da JD »
È 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: +5
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone
  • Market Developer Name:
    Edges Labs
Re:[facile] Creare ed eliminare una Status Bar Notification
« Risposta #1 il: 22 Marzo 2010, 16:46:14 CET »
+2
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: 1590
  • Respect: +196
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus w/ CM9
  • Market Developer Name:
    Roberto Leinardi
  • Sistema operativo:
    Ubuntu 11.10
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: 16
  • Respect: 0
    • 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 junior
  • **
  • Post: 149
  • Respect: +1
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Market Developer Name:
    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: 1590
  • Respect: +196
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus w/ CM9
  • Market Developer Name:
    Roberto Leinardi
  • Sistema operativo:
    Ubuntu 11.10
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 junior
  • **
  • Post: 149
  • Respect: +1
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Market Developer Name:
    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 junior
  • **
  • Post: 149
  • Respect: +1
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Market Developer Name:
    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: 1590
  • Respect: +196
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus w/ CM9
  • Market Developer Name:
    Roberto Leinardi
  • Sistema operativo:
    Ubuntu 11.10
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 junior
  • **
  • Post: 149
  • Respect: +1
    • Mostra profilo
    • Visita il mio blog
  • Dispositivo Android:
    Galaxy ace, Asus eee transformer
  • Market Developer Name:
    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`

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 2695
  • Respect: +370
    • Google+
    • rciovati
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    OS X Lion
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: +2
    • 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: 732
  • Respect: +177
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Nexus One - Wildfire - Magic
  • Market Developer Name:
    egsolutions
  • Sistema operativo:
    Ubuntu 11.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`

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 2695
  • Respect: +370
    • Google+
    • rciovati
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    OS X Lion
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 :)