Notification.Builder tam olarak nasıl kullanılır?


100

Noficitations için kullanımdan kaldırılmış bir yöntem kullandığımı buldum (notification.setLatestEventInfo ())

Notification.Builder'ı kullanmak yazıyor.

  • Bunu nasıl kullanabilirim?

Yeni bir örnek oluşturmaya çalıştığımda bana şunu söylüyor:

Notification.Builder cannot be resolved to a type

Ben fark bu API Seviye 11 dan eserler (Android 3.0).
mobiledev Alex

Yanıtlar:


86

Bu , API 11'dedir, bu nedenle 3.0'dan daha eski bir sürüm için geliştirme yapıyorsanız, eski API'yi kullanmaya devam etmelisiniz.

Güncelleme : Destek Paketine NotificationCompat.Builder sınıfı eklendi, böylece bunu API seviyesi v4 ve üstünü desteklemek için kullanabiliriz:

http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html


Teşekkürler. Neden işlev sayfalarında bundan bahsetmediğini merak ediyorum
Saariko

15
Evet: bence kullanımdan kaldırma uyarısı biraz erken, ama ne biliyorum.
Femi

152

Notification.Builder API 11 veya NotificationCompat.Builder API 1

Bu bir kullanım örneğidir.

Intent notificationIntent = new Intent(ctx, YourClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
        YOUR_PI_REQ_CODE, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);

NotificationManager nm = (NotificationManager) ctx
        .getSystemService(Context.NOTIFICATION_SERVICE);

Resources res = ctx.getResources();
Notification.Builder builder = new Notification.Builder(ctx);

builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.some_img)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.some_big_img))
            .setTicker(res.getString(R.string.your_ticker))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.your_notif_title))
            .setContentText(res.getString(R.string.your_notif_text));
Notification n = builder.build();

nm.notify(YOUR_NOTIF_ID, n);

13
V4 destek paketinde bunu yapmak için bir teknik olduğunu görüyorum: NotificationCompat.Builder
stanlick

6
Sanırım birisi Google’a Notification.Builderdokümanlar sayfasında ciddi yazım hataları olduğunu söylemeli . Onların söylediklerini yapıyordum ama bu hiç mantıklı gelmiyordu. Buraya geliyorum ve farklı olduğunu görüyorum. Dokümandaki hatanın farkına varmamı sağladığı için cevabınızı gerçekten takdir ediyorum.
Andy

5
Belgeler builder.getNotification(), kullanımdan kaldırıldığını söylüyor . Kullanman gerektiğini söylüyor builder.build().
mneri

26
NotificationBuilder.build (), API Seviye 16 veya üstünü gerektirir. API Seviye 11 ve 15 arasında herhangi bir şey için NotificationBuilder.getNotification () kullanmanız gerekir.
Camille Sévigny

4
@MrTristan: belgelerinde yazılı olarak setSmallIcon(), setContentTitle()ve setContentText()minimum gereksinimler.
2014 1

70

Burada seçilen cevaba ek olarak, Kaynak Tricks'tenNotificationCompat.Builder sınıf için bazı örnek kodlar :

// Add app running notification  

    private void addNotification() {



    NotificationCompat.Builder builder =  
            new NotificationCompat.Builder(this)  
            .setSmallIcon(R.drawable.ic_launcher)  
            .setContentTitle("Notifications Example")  
            .setContentText("This is a test notification");  

    Intent notificationIntent = new Intent(this, MainActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);  
    builder.setContentIntent(contentIntent);  

    // Add as notification  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.notify(FM_NOTIFICATION_ID, builder.build());  
}  

// Remove notification  
private void removeNotification() {  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.cancel(FM_NOTIFICATION_ID);  
}  

5
Gerçekten işe yarayan yeni Uyum oluşturucuyu kullanan ilk kod. Aferin!
James MV

1
Benim için de iyi çalıştı. İki not: 1) "ic_launcher" için 32x32'lik bir simge yapmanız gerekecek. Şeffaf arka plan üzerine beyaz çizim 2) int FM_NOTIFICATION_ID = [yourFavoriteRandom] için bazı rasgele sayılar tanımlamanız gerekir;
Anders8

1
çok teşekkür ederim, benim sorunum şuydu: 2. kez bildirime tıkladığımda, önceki parça açıktı ve bu "PendingIntent.FLAG_UPDATE_CURRENT" satırı sorunumu çözdü ve günümü yaptı
Shruti

4

Bildirim Oluşturucu, kesinlikle Android API Seviye 11 ve üzeri (Android 3.0 ve üzeri) içindir.

Bu nedenle, Honeycomb tabletleri hedeflemiyorsanız, Notification Builder'ı kullanmamalısınız, bunun yerine aşağıdaki örnek gibi eski bildirim oluşturma yöntemlerini izlemelisiniz .


4
Uyumluluk Kitaplığını kullanabilir, böylece API 4 veya daha yüksek sürümlerde kullanabilirsiniz.
Leandros

3

GÜNCELLEME android-N (Mart-2016)

Daha fazla ayrıntı için lütfen Bildirim Güncellemeleri bağlantısını ziyaret edin .

  • Doğrudan Cevap
  • Paket Bildirimler
  • Özel Görünümler

Android N ayrıca benzer bildirimleri tek bir bildirim olarak görünecek şekilde gruplamanıza da olanak tanır. Bunu mümkün kılmak için Android N mevcutNotificationCompat.Builder.setGroup() yöntemi . Kullanıcılar, bildirimlerin her birini genişletebilir ve bildirim gölgesinden ayrı ayrı her bildirimi yanıtla ve kapat gibi eylemler gerçekleştirebilir.

Bu, NotificationCompat kullanarak bildirimler gönderen basit bir hizmeti gösteren önceden var olan bir örnektir. Bir kullanıcının her okunmamış görüşmesi ayrı bir bildirim olarak gönderilir.

Bu örnek, Android N'de bulunan yeni bildirim özelliklerinden yararlanmak için güncellendi.

örnek kod .


merhaba, downloader_library kullanırken bu yöntemin Android 6.0'da nasıl çalıştırılacağını söyleyebilir misiniz? Eclipse SDK - 25.1.7 kullanıyorum || ADT 23.0.X ne yazık ki || Google APK Genişletme Kitaplığı ve Lisans Kitaplığı hem 1.0
mfaisalhyder

2

Bildirim oluşturmada sorun yaşıyordum (yalnızca Android 4.0+ için geliştiriliyor). Bu bağlantı bana tam olarak neyi yanlış yaptığımı gösterdi ve şunları söylüyor:

Required notification contents

A Notification object must contain the following:

A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()

Temelde bunlardan biri eksikti. Bununla ilgili sorun giderme temeli olarak, en azından bunların hepsine sahip olduğunuzdan emin olun. Umarım bu bir başkasını baş ağrısından kurtarır.


Yani "daha sonra bir simge bulacağım" diye düşünürseniz, herhangi bir bildirim-aşk almayacaksınız. Bunun için teşekkürler;)
Nanne

2

API 8'de bile çalışır, bu kodu kullanabilirsiniz:

 Notification n = 
   new Notification(R.drawable.yourownpicturehere, getString(R.string.noticeMe), 
System.currentTimeMillis());

PendingIntent i=PendingIntent.getActivity(this, 0,
             new Intent(this, NotifyActivity.class),
                               0);
n.setLatestEventInfo(getApplicationContext(), getString(R.string.title), getString(R.string.message), i);
n.number=++count;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.flags |= Notification.DEFAULT_SOUND;
n.flags |= Notification.DEFAULT_VIBRATE;
n.ledARGB = 0xff0000ff;
n.flags |= Notification.FLAG_SHOW_LIGHTS;

// Now invoke the Notification Service
String notifService = Context.NOTIFICATION_SERVICE;
NotificationManager mgr = 
   (NotificationManager) getSystemService(notifService);
mgr.notify(NOTIFICATION_ID, n);

Veya bununla ilgili mükemmel bir öğreticiyi takip etmenizi öneririm


2

Kullandım

Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());

1

Herhangi birine yardımcı olması durumunda ... Daha yeni ve eski API'lara karşı test ederken destek paketini kullanarak bildirimleri ayarlamakta çok sorun yaşıyordum. Onları daha yeni cihazda çalıştırmayı başardım, ancak eski cihazda bir hata testi alırdım. Sonunda benim için çalışmasını sağlayan şey, bildirim işlevleriyle ilgili tüm ithalatları silmekti. Özellikle NotificationCompat ve TaskStackBuilder. Görünüşe göre kodumu başlangıçta kurarken, destek paketinden değil, daha yeni derlemeden eklenen içe aktarmalar. Daha sonra bu öğeleri daha sonra tutulmada uygulamak istediğimde, onları tekrar içe aktarmam istenmedi. Umarım bu mantıklıdır ve başka birine yardımcı olur :)


0
          // This is a working Notification
       private static final int NotificID=01;
   b= (Button) findViewById(R.id.btn);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Notification notification=new       Notification.Builder(MainActivity.this)
                    .setContentTitle("Notification Title")
                    .setContentText("Notification Description")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .build();
            NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            notification.flags |=Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(NotificID,notification);


        }
    });
}

0

Bağımsız örnek

Bu cevapta olduğu gibi aynı teknik ama:

  • kendi kendine yeten: kopyalayıp yapıştırın ve derleyip çalıştıracaktır
  • istediğiniz kadar bildirim oluşturmanızı ve niyet ve bildirim kimlikleriyle oynamanızı sağlayan bir düğme ile

Kaynak:

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Button button = new Button(this);
        button.setText("click me");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Notification notification = new Notification.Builder(Main.this)
                        /* Make app open when you click on the notification. */
                        .setContentIntent(PendingIntent.getActivity(
                                Main.this,
                                Main.this.i,
                                new Intent(Main.this, Main.class),
                                PendingIntent.FLAG_CANCEL_CURRENT))
                        .setContentTitle("title")
                        .setAutoCancel(true)
                        .setContentText(String.format("id = %d", Main.this.i))
                        // Starting on Android 5, only the alpha channel of the image matters.
                        // https://stackoverflow.com/a/35278871/895245
                        // `android.R.drawable` resources all seem suitable.
                        .setSmallIcon(android.R.drawable.star_on)
                        // Color of the background on which the alpha image wil drawn white.
                        .setColor(Color.RED)
                        .build();
                final NotificationManager notificationManager =
                        (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Main.this.i, notification);
                // If the same ID were used twice, the second notification would replace the first one. 
                //notificationManager.notify(0, notification);
                Main.this.i++;
            }
        });
        this.setContentView(button);
    }
}

Android 22'de test edilmiştir.

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.