112 Stimmen

Senden einer Benachrichtigung von einem Dienst in Android

Ich habe einen Dienst laufen und möchte eine Benachrichtigung senden. Zu dumm nur, dass das Benachrichtigungsobjekt eine Context , wie ein Activity und nicht ein Service .

Kennen Sie eine Möglichkeit, das zu umgehen? Ich habe versucht, eine Activity für jede Benachrichtigung, aber es scheint hässlich zu sein, und ich kann keine Möglichkeit finden, eine Activity ohne jegliche View .

15 Stimmen

Ähm... eine Dienstleistung ist einen Kontext!

20 Stimmen

Gott, ich bin so ein Trottel. Ok, tut mir leid, dass ich die Zeit von allen verschwendet habe.

32 Stimmen

Das ist in Ordnung - es ist eine gute Google-Frage.

113voto

Josef Pfleger Punkte 73395

Beide Activity y Service eigentlich extend Context Sie können also einfach this als Ihr Context innerhalb Ihrer 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 Stimmen

Denken Sie daran, dass Sie viele Probleme haben werden, wenn Sie von einem Dienst benachrichtigt werden. Wenn Sie Probleme haben, sehen Sie sich das hier an groups.google.com/group/Android-developers/browse_thread/thread/

1 Stimmen

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

80voto

trante Punkte 32326

Diese Art von Benachrichtigung ist veraltet, wie aus den Dokumenten ersichtlich:

@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
Der obige Code benötigt mindestens API-Level 11 (Android 3.0).
Wenn Ihre Mindest-API-Stufe niedriger als 11 ist, sollten Sie die Hilfsbibliothek NotificationCompat-Klasse wie folgt.

Wenn Sie also mindestens die API-Stufe 4+ (Android 1.6+) anstreben, verwenden Sie diese:

    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 Stimmen

Dies sollte die beste Antwort sein, da die akzeptierte Antwort veraltet ist

4 Stimmen

@MarcelKrivek Offenbar hat er oder sie "vergessen", die Quelle anzugeben. vogella.com/anleitungen/AndroidBenachrichtigungen/article.html

0 Stimmen

Was ist "NotificationReceiver"?

7voto

David Wang Punkte 876
@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);
}

0 Stimmen

Das Thema Frage ist von einem SERVICE nicht Aktivität

1voto

Martin Pfeffer Punkte 11992

Nun, ich bin mir nicht sicher, ob meine Lösung die beste Praxis ist. Die Verwendung der NotificationBuilder Mein Code sieht so 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 Dienst:

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

Ich weiß nicht, ob es wirklich eine singleTask en Service aber bei meiner Anwendung funktioniert das einwandfrei...

0 Stimmen

Was hat der Bauherr damit zu tun?

-3voto

Wenn das alles nicht funktioniert, versuchen Sie getBaseContext() anstelle von context o this .

2 Stimmen

Sie sollten nicht verwenden getBaseContext() sind diese Szenarien.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X