Senden einer Benachrichtigung von einem Dienst in Android


105

Ich habe einen Dienst ausgeführt und möchte eine Benachrichtigung senden. Schade, das Benachrichtigungsobjekt erfordert ein Context, wie ein Activityund kein Service.

Kennen Sie einen Weg, das zu umgehen? Ich habe versucht, Activityfür jede Benachrichtigung eine zu erstellen, aber es scheint hässlich, und ich kann keinen Weg finden, eine Activityohne zu starten View.


14
Umm ... ein Service ist ein Kontext!
Isaac Waller

19
Gott, ich bin so ein Idiot. Ok, tut mir leid, dass ich alle Zeit verschwenden muss.
E-Satis

28
Das ist in Ordnung - es ist eine gute Google-Frage.
Isaac Waller

Wie Ihr zweiter Kommentar: D: D
Faizan Mubasher

Dieser Beitrag hat gerade meinen Tag gerettet ...
Muhammad Faizan

Antworten:


109

Beides Activityund Serviceeigentlich extend Contextso können Sie einfach thisals Ihr Contextin Ihrem verwenden Service.

NotificationManager notificationManager =
    (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
Notification notification = new Notification(/* your notification */);
PendingIntent pendingIntent = /* your intent */;
notification.setLatestEventInfo(this, /* your content */, pendingIntent);
notificationManager.notify(/* id */, notification);

4
Beachten Sie, dass Sie bei der Benachrichtigung eines Dienstes viele Probleme haben werden. Wenn Sie Probleme haben, schauen Sie sich diese groups.google.com/group/android-developers/browse_thread/thread/…
Karussell

1
Wie können Sie dies mit dem Notification.Builder tun? weil setLatestEventInfo bereits veraltet ist.
Kairi San

77

Diese Art der Benachrichtigung ist veraltet, wie aus Dokumenten hervorgeht:

@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 */ }

Besserer Weg
Sie können eine Benachrichtigung wie folgt senden:

// 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); 

Bester Weg
Code oben benötigt mindestens API-Level 11 (Android 3.0).
Wenn Ihre Mindest-API-Stufe unter 11 liegt, sollten Sie die NotificationCompat-Klasse der Support-Bibliothek wie folgt verwenden .

Wenn Ihre Mindestziel-API-Stufe 4+ (Android 1.6+) beträgt, verwenden Sie Folgendes:

    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());

4
Dies sollte die beste Antwort sein, da die akzeptierte veraltet ist
Marcel Krivek

4
@MarcelKrivek Scheint, als hätte er oder sie "vergessen", ihre Quelle zu zitieren. vogella.com/tutorials/AndroidNotifications/article.html
StarWind0

Was ist "NotificationReceiver"?
user3690202

"NotificationReceiver" ist die Aktivität, die von der Benachrichtigung geöffnet wird. Überprüfen Sie den von @ StarWind0 bereitgestellten Link.
George Theodorakis

NotificationCompat.Builder ist bereits veraltet. Es ist jetzt nicht mehr die beste Antwort
Devil's Dream

7
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public void PushNotification()
{
    NotificationManager nm = (NotificationManager)context.getSystemService(NOTIFICATION_SERVICE);
    Notification.Builder builder = new Notification.Builder(context);
    Intent notificationIntent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context,0,notificationIntent,0);

    //set
    builder.setContentIntent(contentIntent);
    builder.setSmallIcon(R.drawable.cal_icon);
    builder.setContentText("Contents");
    builder.setContentTitle("title");
    builder.setAutoCancel(true);
    builder.setDefaults(Notification.DEFAULT_ALL);

    Notification notification = builder.build();
    nm.notify((int)System.currentTimeMillis(),notification);
}

Die Themenfrage ist von einem SERVICE nicht Aktivität
Duna

1

Ich bin mir nicht sicher, ob meine Lösung die beste Vorgehensweise ist. Die Verwendung des NotificationBuildermy-Codes sieht folgendermaßen aus:

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());
    }

Manifest:

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

und hier der Service:

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

Ich weiß nicht, ob es wirklich ein singleTaskat gibt, Serviceaber das funktioniert bei meiner Anwendung richtig ...


Was ist der Erbauer darin?
Viswanath Lekshmanan

-2

Wenn nichts davon funktioniert, versuchen Sie es getBaseContext()anstelle von contextoder this.


2
Sie sollten getBaseContext()diese Szenarien nicht verwenden .
Rahat Zaman
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.