Отправка уведомления от службы в Android


105

У меня работает служба, и я хочу отправить уведомление. Жаль, что объект уведомления требует a Context, например Activity, а не Service.

Вы знаете способ обойти это? Я пытался создать Activityдля каждого уведомления, но это кажется некрасивым, и я не могу найти способ запустить Activityбез них View.


14
Умм ... Сервис - это контекст!
Исаак Уоллер,

19
Боже, я такая тупица. Ладно, извините, что тратите время попусту.
e-satis

28
Это нормально - это хороший вопрос Google.
Исаак Уоллер,

Нравится ваш второй комментарий: D: D
Faizan Mubasher 01

Этот пост просто спас мне день ...
Мухаммад Файзан

Ответы:


109

Оба, Activityи на Serviceсамом деле, extend Contextвы можете просто использовать thisкак свои Contextвнутри вашего 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
Имейте в виду, что у вас будет много проблем с уведомлением от службы. Если у вас есть проблемы , то посмотрите на эту groups.google.com/group/android-developers/browse_thread/thread/...
Karussell

1
как это можно сделать с помощью Notification.Builder? потому что setLatestEventInfo уже устарел.
Кайри Сан

77

Этот тип уведомления устарел, как видно из документов:

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

Лучше всего
вы можете отправить уведомление следующим образом:

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

Наилучший вариант
кода, приведенного выше, требует минимального уровня API 11 (Android 3.0).
Если ваш минимальный уровень API ниже 11, вам следует использовать класс библиотеки поддержки NotificationCompat, подобный этому.

Итак, если ваш минимальный целевой уровень API составляет 4+ (Android 1.6+), используйте это:

    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
это должен быть лучший ответ, поскольку принятый
вариант

4
@MarcelKrivek Кажется, он или она «забыли» процитировать их источник. vogella.com/tutorials/AndroidNotifications/article.html
StarWind0

Что такое «NotificationReceiver»?
user3690202

«NotificationReceiver» - это действие, которое будет открываться уведомлением. Проверьте ссылку, предоставленную @ StarWind0.
Джордж Теодоракис

NotificationCompat.Builder уже устарел. Теперь это уже не лучший ответ
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);
}

Вопрос в теме от СЛУЖБЫ, а не от деятельности
Дуна,

1

Что ж, я не уверен, что мое решение лучше всего. Использование NotificationBuilderмоего кода выглядит так:

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

Манифест:

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

а здесь Сервис:

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

Я не знаю, действительно ли есть singleTaskat, Serviceно в моем приложении это работает правильно ...


что за строитель в этом?
Вишванат Лекшманан

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.