วิธีใช้ Notification.Builder


100

ฉันพบว่าฉันใช้เมธอดที่เลิกใช้แล้วสำหรับ noficitations (notification.setLatestEventInfo ())

มันบอกว่าให้ใช้ Notification.Builder

  • ฉันจะใช้มันได้อย่างไร?

เมื่อฉันพยายามสร้างอินสแตนซ์ใหม่มันบอกฉัน:

Notification.Builder cannot be resolved to a type

ฉันสังเกตว่าสิ่งนี้ใช้ได้กับ API ระดับ 11 (Android 3.0)
mobiledev Alex

คำตอบ:


86

สิ่งนี้อยู่ใน API 11 ดังนั้นหากคุณกำลังพัฒนาอะไรที่เร็วกว่า 3.0 คุณควรใช้ API เก่าต่อไป

อัปเดต : มีการเพิ่มคลาส NotificationCompat.Builder ใน Support Package เพื่อให้เราสามารถใช้สิ่งนี้เพื่อรองรับ API ระดับ v4 ขึ้นไป:

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


ขอบคุณ. ฉันสงสัยว่าทำไมถึงไม่พูดถึงสิ่งนั้นในหน้าฟังก์ชั่นตัวเอง
Saariko

15
ใช่: คำเตือนการเลิกใช้งานค่อนข้างก่อนกำหนดในความคิดของฉัน แต่ฉันรู้อะไร
Femi

152

Notification.Builder API 11หรือNotificationCompat.Builder API 1

นี่คือตัวอย่างการใช้งาน

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: NotificationCompat.Builder
stanlick

6
ฉันคิดว่ามีคนบอก Google ว่าพวกเขาพิมพ์ผิดอย่างร้ายแรงในNotification.Builderหน้าเอกสาร ฉันกำลังทำตามที่พวกเขาพูด แต่มันไม่สมเหตุสมผลเลย ฉันมาที่นี่และเห็นว่ามันแตกต่างกัน ฉันขอขอบคุณสำหรับคำตอบของคุณเนื่องจากทำให้ฉันทราบถึงความผิดพลาดในเอกสาร
Andy

5
เอกสารระบุว่าbuilder.getNotification()เลิกใช้งานแล้ว builder.build()มันบอกว่าคุณควรใช้
mneri

26
NotificationBuilder.build () ต้องการ API ระดับ 16 หรือสูงกว่า อะไรก็ได้ระหว่าง API ระดับ 11 และ 15 คุณควรใช้ NotificationBuilder.getNotification ()
Camille Sévigny

4
@MrTristan: ในฐานะที่เขียนในเอกสารsetSmallIcon(), setContentTitle()และsetContentText()เป็นความต้องการขั้นต่ำ
caw

70

นอกจากคำตอบที่เลือกแล้วนี่คือโค้ดตัวอย่างสำหรับNotificationCompat.BuilderคลาสจากSource Tricks :

// 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
รหัสแรกโดยใช้ตัวสร้าง Compat ใหม่ที่ใช้งานได้จริง ทำได้ดี!
James MV

1
ทำงานได้ดีสำหรับฉันด้วย หมายเหตุสองข้อ: 1) คุณจะต้องสร้างไอคอน 32x32 สำหรับ "ic_launcher" ภาพวาดสีขาวบนพื้นหลังโปร่งใส 2) คุณจะต้องกำหนดหมายเลขสุ่มสำหรับ int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8

1
ขอบคุณมากปัญหาของฉันคือเมื่อฉันคลิกที่การแจ้งเตือนครั้งที่ 2 ส่วนก่อนหน้าเปิดอยู่และบรรทัดนี้ "PendingIntent.FLAG_UPDATE_CURRENT" แก้ไขปัญหาของฉันและทำให้วันของฉัน
Shruti

4

เครื่องมือสร้างการแจ้งเตือนใช้สำหรับ Android API ระดับ 11 ขึ้นไปเท่านั้น (Android 3.0 ขึ้นไป)

ดังนั้นหากคุณไม่ได้กำหนดเป้าหมายแท็บเล็ต Honeycomb คุณไม่ควรจะใช้แจ้ง Builder แต่จะทำตามวิธีการสร้างการแจ้งเตือนเก่าเช่นต่อไปนี้เช่น


4
คุณสามารถใช้ไลบรารีความเข้ากันได้ดังนั้นคุณจึงใช้กับ API 4 ขึ้นไปได้
Leandros

3

อัปเดต android-N (มีนาคม -2559)

โปรดไปที่ลิงค์การอัปเดตการแจ้งเตือนสำหรับรายละเอียดเพิ่มเติม

  • ตอบกลับโดยตรง
  • รวมการแจ้งเตือน
  • มุมมองที่กำหนดเอง

Android N ยังช่วยให้คุณสามารถรวมการแจ้งเตือนที่คล้ายกันเพื่อให้ปรากฏเป็นการแจ้งเตือนเดียว เพื่อให้เป็นไปได้ Android N ใช้ไฟล์NotificationCompat.Builder.setGroup()วิธีการผู้ใช้สามารถขยายการแจ้งเตือนแต่ละรายการและดำเนินการต่างๆเช่นตอบกลับและปิดการแจ้งเตือนแต่ละรายการแยกกันจากหน้าต่างแจ้งเตือน

นี่คือตัวอย่างที่มีอยู่แล้วซึ่งแสดงบริการง่ายๆที่ส่งการแจ้งเตือนโดยใช้ NotificationCompat การสนทนาที่ยังไม่ได้อ่านแต่ละรายการจากผู้ใช้จะถูกส่งเป็นการแจ้งเตือนที่แตกต่างกัน

ตัวอย่างนี้ได้รับการอัปเดตเพื่อใช้ประโยชน์จากคุณสมบัติการแจ้งเตือนใหม่ที่มีใน Android N

โค้ดตัวอย่าง


สวัสดีคุณช่วยบอกวิธีทำให้วิธีนี้ใช้ได้กับ Android 6.0 เมื่อเราใช้ downloader_library ฉันใช้ Eclipse SDK - 25.1.7 || ADT 23.0.X เศร้า || Google APK Expansion Library และ Licensing Library ทั้ง 1.0
mfaisalhyder

2

ฉันมีปัญหาในการสร้างการแจ้งเตือน (พัฒนาสำหรับ Android 4.0+ เท่านั้น) ลิงก์นี้แสดงให้ฉันเห็นว่าฉันทำอะไรผิดพลาดและพูดสิ่งต่อไปนี้:

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

โดยพื้นฐานแล้วฉันพลาดสิ่งเหล่านี้ไป เพื่อเป็นพื้นฐานในการแก้ไขปัญหานี้ตรวจสอบให้แน่ใจว่าคุณมีสิ่งเหล่านี้ทั้งหมดอย่างน้อยที่สุด หวังว่านี่จะช่วยให้คนอื่นปวดหัวได้


ดังนั้นหากคุณคิดว่า: "ฉันจะพบไอคอนในภายหลัง" คุณจะไม่ได้รับการแจ้งเตือนใด ๆ ขอบคุณสำหรับสิ่งนี้;)
แนน

2

ใช้งานได้แม้ใน API 8 คุณสามารถใช้รหัสนี้:

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

หรือฉันขอแนะนำให้ทำตามบทแนะนำที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้


2

ฉันได้ใช้

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

ในกรณีที่มันช่วยทุกคน ... ฉันมีปัญหากับการตั้งค่าการแจ้งเตือนโดยใช้แพ็คเกจการสนับสนุนเมื่อทดสอบกับ API รุ่นเก่าที่ใหม่กว่า ฉันสามารถทำให้พวกเขาทำงานบนอุปกรณ์รุ่นใหม่ได้ แต่จะได้รับการทดสอบข้อผิดพลาดในอุปกรณ์เครื่องเก่า ในที่สุดสิ่งที่ทำให้ฉันได้ผลคือการลบการนำเข้าทั้งหมดที่เกี่ยวข้องกับฟังก์ชันการแจ้งเตือน โดยเฉพาะ NotificationCompat และ TaskStackBuilder ดูเหมือนว่าในขณะตั้งค่ารหัสของฉันในช่วงเริ่มต้นการนำเข้าที่เพิ่มจากบิลด์ที่ใหม่กว่าไม่ใช่จากแพ็คเกจการสนับสนุน จากนั้นเมื่อฉันต้องการใช้ไอเท็มเหล่านี้ในภายหลังในคราสฉันไม่ได้รับแจ้งให้นำเข้าอีกครั้ง หวังว่าคงสมเหตุสมผลและจะช่วยให้คนอื่นได้รับ :)


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

ตัวอย่างที่มีอยู่ในตัว

เทคนิคเดียวกับในคำตอบนี้แต่:

  • มีอยู่ในตัว: คัดลอกวางและจะรวบรวมและเรียกใช้
  • ด้วยปุ่มเพื่อให้คุณสร้างการแจ้งเตือนได้มากเท่าที่คุณต้องการและเล่นด้วยความตั้งใจและรหัสการแจ้งเตือน

ที่มา:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.