Android'de bir hizmetten bildirim gönderme


105

Çalışan bir hizmetim var ve bir bildirim göndermek istiyorum. Çok kötü, bildirim nesnesi a Contextgibi bir gerektirir, a Activitydeğil Service.

Bunu atlatmanın bir yolunu biliyor musun? ActivityHer bildirim için bir tane oluşturmaya çalıştım ama çirkin görünüyor ve Activityherhangi bir bildirim olmadan başlatmanın bir yolunu bulamıyorum View.


14
Umm ... Bir Servis olan bir bağlam!
Isaac Waller

19
Tanrım, çok aptalım. Tamam, herkesin zamanını harcadığım için üzgünüm.
e-satis

28
Sorun değil - bu iyi bir Google sorusu.
Isaac Waller

İkinci yorumunuz gibi: D: D
Faizan Mubasher

Bu gönderi az önce günümü kurtardı ...
Muhammad Faizan

Yanıtlar:


109

Hem Activityve Serviceaslında extend Contextçok değil sadece kullanabilirsiniz thissenin kadar ContextSİZİN içinde 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
Bir hizmetten bildirim alırken pek çok sorun yaşayacağınızı unutmayın. Sorun yaşarsanız, bu groups.google.com/group/android-developers/browse_thread/thread/…
Karussell

1
Notification.Builder'ı kullanarak bunu nasıl yapabilirsiniz? çünkü setLatestEventInfo zaten kullanımdan kaldırılmıştır.
Kairi San

77

Bu tür bir Bildirim, belgelerden görüldüğü gibi kullanımdan kaldırılmıştır:

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

Daha iyi bir yol
Bunun gibi bir bildirim gönderebilirsiniz:

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

En iyi yol
Kod yukarıdaki minimum API seviye 11'e ihtiyaç duyar (Android 3.0).
Minimum API seviyeniz 11'den düşükse, bunun gibi destek kitaplığının NotificationCompat sınıfını kullanmalısınız .

Dolayısıyla, minimum hedef API seviyeniz 4+ (Android 1.6+) ise şunu kullanın:

    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
kabul edilen cevap kullanımdan kaldırıldığı için bu en iyi cevap olmalı
Marcel Krivek

4
@MarcelKrivek, kaynağından alıntı yapmayı "unutmuş" görünüyor. vogella.com/tutorials/AndroidNotifications/article.html
StarWind0

"NotificationReceiver" nedir?
user3690202

"Bildirim Alıcısı", Bildirim ile açılacak Faaliyettir. @ StarWind0 tarafından sağlanan bağlantıyı kontrol edin.
George Theodorakis

NotificationCompat.Builder zaten kullanımdan kaldırıldı. Şimdi artık en iyi cevap değil
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);
}

Konu bir HİZMET değil Etkinlikten
Duna

1

Çözümümün en iyi uygulama olduğundan emin değilim. NotificationBuilderKodumu kullanmak şuna benzer:

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

Belirgin:

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

ve burada Hizmet:

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

Gerçekten bir singleTaskat var mı bilmiyorum Serviceama bu benim başvurumda düzgün çalışıyor ...


bunun içindeki kurucu nedir?
Viswanath Lekshmanan

-2

Bunların hiçbiri işe yaramazsa, veya getBaseContext()yerine deneyin .contextthis


2
getBaseContext()Bu senaryoları kullanmamalısınız .
Rahat Zaman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.