Envoyer une notification d'un service dans Android


1 Answers

Ce type de notification est obsolète vu des documents:

@java.lang.Deprecated
public Notification(int icon, java.lang.CharSequence tickerText, long when) { /* compiled code */ }

public Notification(android.os.Parcel parcel) { /* compiled code */ }

@java.lang.Deprecated
public void setLatestEventInfo(android.content.Context context, java.lang.CharSequence contentTitle, java.lang.CharSequence contentText, android.app.PendingIntent contentIntent) { /* compiled code */ }

Meilleure façon
Vous pouvez envoyer une notification comme ceci:

// prepare intent which is triggered if the
// notification is selected

Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent, 0);

// build notification
// the addAction re-use the same intent to keep the example short
Notification n  = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .setContentText("Subject")
        .setSmallIcon(R.drawable.icon)
        .setContentIntent(pIntent)
        .setAutoCancel(true)
        .addAction(R.drawable.icon, "Call", pIntent)
        .addAction(R.drawable.icon, "More", pIntent)
        .addAction(R.drawable.icon, "And more", pIntent).build();


NotificationManager notificationManager = 
  (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

notificationManager.notify(0, n); 

Meilleur moyen
Le code ci-dessus nécessite un niveau d'API 11 minimum (Android 3.0).
Si votre niveau d'API minimum est inférieur à 11, vous devez utiliser la classe NotificationCompat de la bibliothèque de support comme ceci.

Donc, si votre niveau d'API cible minimum est 4+ (Android 1.6+), utilisez ceci:

    import android.support.v4.app.NotificationCompat;
    -------------
    NotificationCompat.Builder builder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.mylogo)
                    .setContentTitle("My Notification Title")
                    .setContentText("Something interesting happened");
    int NOTIFICATION_ID = 12345;

    Intent targetIntent = new Intent(this, MyFavoriteActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, targetIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    nManager.notify(NOTIFICATION_ID, builder.build());
Question

J'ai un service en cours d'exécution, et je voudrais envoyer une notification. Dommage, l'objet de notification nécessite un Context , comme une Activity , et non un Service .

Connaissez-vous un moyen de contourner cela? J'ai essayé de créer une Activity pour chaque notification mais elle semble moche, et je ne peux pas trouver un moyen de lancer une Activity sans aucune View .




Eh bien, je ne suis pas sûr si ma solution est la meilleure pratique. En utilisant le NotificationBuilder mon code ressemble à ceci:

private void showNotification() {
    Intent notificationIntent = new Intent(this, MainActivity.class);

    PendingIntent contentIntent = PendingIntent.getActivity(
                this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(contentIntent);
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
    }

Manifeste:

    <activity
        android:name=".MainActivity"
        android:launchMode="singleInstance"
    </activity>

et voici le service:

    <service
        android:name=".services.ProtectionService"
        android:launchMode="singleTask">
    </service>

Je ne sais pas s'il y a vraiment une singleTask au Service mais cela fonctionne correctement à mon application ...






Related