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

105

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

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

e-satis
источник
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но в моем приложении это работает правильно ...

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

Если ничего из этого не работает, попробуйте getBaseContext()вместо contextили this.

курдист андроид
источник
2
Вы не должны использовать getBaseContext()эти сценарии.
Rahat Zaman