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.

e-satis
quelle
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);
Josef Pfleger
quelle
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 " + "[email protected]")
        .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());
trante
quelle
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);
}
王怡飞
quelle
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 ...

Martin Pfeffer
quelle
Was ist der Erbauer darin?
Viswanath Lekshmanan
-2

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

kurdist android
quelle
2
Sie sollten getBaseContext()diese Szenarien nicht verwenden .
Rahat Zaman