it-swarm.com.de

Senden einer Benachrichtigung von einem Dienst in Android

Ich habe einen laufenden Dienst und möchte eine Benachrichtigung senden. Schade, das Benachrichtigungsobjekt benötigt ein Context, wie ein Activity, und kein Service.

Wissen Sie, wie Sie das umgehen können? Ich habe versucht, für jede Benachrichtigung ein Activity zu erstellen, aber es scheint hässlich zu sein, und ich kann keinen Weg finden, ein Activity ohne ein View zu starten.

98
e-satis

Sowohl Activity als auch Service tatsächlich extendContext , sodass Sie this einfach als Ihr Context in Ihrem 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);
105
Josef Pfleger

Diese Art der Benachrichtigung wird aus folgenden Dokumenten nicht mehr empfohlen:

@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
Für den obigen Code ist mindestens API-Level 11 (Android 3.0) erforderlich.
Wenn Ihre minimale API-Stufe niedriger als 11 ist, sollten Sie die NotificationCompat-Klasse von Support Library wie diese verwenden.

Wenn Ihr minimales Ziel-API-Level also 4+ (Android 1.6+) ist, 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());
75
trante
@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);
}
7
王怡飞

Nun, ich bin mir nicht sicher, ob es sich bei meiner Lösung um eine bewährte Methode handelt. Mit dem NotificationBuilder sieht mein Code 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 Service:

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

Ich weiß nicht, ob es wirklich ein singleTask bei Service gibt, aber das funktioniert in meiner Anwendung einwandfrei ...

1
Martin Pfeffer