Cách chính xác để sử dụng Notification.Builder


100

Tôi nhận thấy rằng tôi đang sử dụng một phương pháp không được dùng cho hư cấu (thông báo.setLatestEventInfo ())

Nó nói sử dụng Notification.Builder.

  • Làm thế nào để tôi sử dụng nó?

Khi tôi cố gắng tạo một phiên bản mới, nó cho tôi biết:

Notification.Builder cannot be resolved to a type

Tôi nhận thấy rằng điều này hoạt động từ API Cấp 11 (Android 3.0).
mobiledev Alex

Câu trả lời:


86

Đây là trong API 11, vì vậy nếu bạn đang phát triển cho bất kỳ thứ gì sớm hơn 3.0, bạn nên tiếp tục sử dụng API cũ.

Cập nhật : lớp NotificationCompat.Builder đã được thêm vào Gói hỗ trợ để chúng tôi có thể sử dụng lớp này để hỗ trợ API cấp v4 trở lên:

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


Cảm ơn. Tôi tự hỏi tại sao nó không đề cập đến điều đó trên chính các trang chức năng
Saariko

15
Vâng: cảnh báo không dùng nữa theo quan điểm của tôi là hơi sớm, nhưng tôi biết gì.
Femi

152

Notification.Builder API 11 hoặc NotificationCompat.Builder API 1

Đây là một ví dụ sử dụng.

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
Tôi thấy có một kỹ thuật để thực hiện việc này trong gói hỗ trợ v4: NotificationCompat.Builder
stanlick vào

6
Tôi nghĩ ai đó nên nói với Google rằng họ mắc lỗi chính tả nghiêm trọng trong Notification.Buildertrang tài liệu. Tôi đang làm những gì họ nói nhưng nó không có ý nghĩa gì. Tôi đến đây và thấy nó khác hẳn. Tôi thực sự đánh giá cao câu trả lời của bạn vì nó khiến tôi nhận thức được sai sót trong tài liệu.
Andy

5
Tài liệu cho biết builder.getNotification()không được dùng nữa. Nó nói rằng bạn nên sử dụng builder.build().
mneri

26
NotificationBuilder.build () yêu cầu API Cấp 16 trở lên. Bất kỳ thứ gì giữa API Cấp 11 và 15, bạn nên sử dụng NotificationBuilder.getNotification ().
Camille Sévigny

4
@MrTristan: Như đã viết trong tài liệu setSmallIcon(), setContentTitle()setContentText()là những yêu cầu tối thiểu.
caw

70

Ngoài câu trả lời đã chọn, đây là một số mã mẫu cho NotificationCompat.Builderlớp từ Thủ thuật Nguồn :

// 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
Mã đầu tiên sử dụng trình tạo Compat mới đã thực sự hoạt động. Làm tốt!
James MV

1
Làm việc tốt cho tôi quá. Hai lưu ý: 1) bạn sẽ cần tạo biểu tượng 32x32 cho "ic_launcher". Bản vẽ màu trắng trên nền trong suốt 2) bạn sẽ cần xác định một số ngẫu nhiên cho int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders 8

1
cảm ơn bạn rất nhiều, Vấn đề của tôi là: khi tôi nhấp vào thông báo lần thứ 2, phân đoạn trước đó đã mở và dòng này "PendingIntent.FLAG_UPDATE_CURRENT" đã giải quyết được vấn đề của tôi và tạo nên ngày của tôi
Shruti

4

Trình tạo thông báo hoàn toàn dành cho Android API Cấp 11 trở lên (Android 3.0 trở lên).

Do đó, nếu bạn không nhắm mục tiêu máy tính bảng Honeycomb, bạn không nên sử dụng Trình tạo thông báo mà hãy làm theo các phương pháp tạo thông báo cũ hơn như ví dụ sau .


4
Bạn có thể sử dụng Thư viện khả năng tương thích, vì vậy bạn có thể sử dụng nó trên API 4 trở lên.
Leandros

3

CẬP NHẬT android-N (tháng 3 năm 2016)

Vui lòng truy cập liên kết Cập nhật Thông báo để biết thêm chi tiết.

  • Trả lời trực tiếp
  • Thông báo nhóm
  • Chế độ xem tùy chỉnh

Android N cũng cho phép bạn nhóm các thông báo tương tự để xuất hiện dưới dạng một thông báo. Để thực hiện điều này, Android N sử dụngNotificationCompat.Builder.setGroup() phương pháp . Người dùng có thể mở rộng từng thông báo và thực hiện các hành động như trả lời và loại bỏ từng thông báo, riêng lẻ từ ngăn thông báo.

Đây là mẫu đã có từ trước cho thấy một dịch vụ đơn giản gửi thông báo bằng NotificationCompat. Mỗi cuộc trò chuyện chưa đọc từ người dùng được gửi dưới dạng một thông báo riêng biệt.

Mẫu này đã được cập nhật để tận dụng các tính năng thông báo mới có trong Android N.

mẫu mã .


xin chào, bạn có thể cho biết làm thế nào để phương pháp này hoạt động trên Android 6.0 khi chúng tôi đang sử dụng downloader_library. Tôi đang sử dụng SDK Eclipse - 25.1.7 || ADT 23.0.X buồn bã || Thư viện mở rộng APK của Google và Thư viện cấp phép cả 1.0
mfaisalhyder

2

Tôi đang gặp sự cố khi tạo thông báo (chỉ phát triển cho Android 4.0+). Liên kết này cho tôi thấy chính xác những gì tôi đã làm sai và nói những điều sau:

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

Về cơ bản tôi đã thiếu một trong số này. Chỉ là cơ sở để khắc phục sự cố với điều này, hãy đảm bảo rằng bạn có tất cả những điều này ít nhất. Hy vọng rằng điều này sẽ giúp người khác đỡ đau đầu.


Vì vậy, nếu bạn nghĩ: "Tôi sẽ tìm thấy một biểu tượng sau", bạn sẽ không nhận được bất kỳ thông báo-tình yêu nào. Cảm ơn vì điều này;)
Nanne

1

Trong trường hợp nó giúp ích cho bất kỳ ai ... Tôi đã gặp rất nhiều khó khăn với việc thiết lập thông báo bằng gói hỗ trợ khi thử nghiệm với API cũ hơn mới hơn. Tôi đã có thể làm cho chúng hoạt động trên thiết bị mới hơn nhưng sẽ gặp lỗi kiểm tra trên thiết bị cũ. Điều cuối cùng đã làm cho nó hoạt động đối với tôi là xóa tất cả các nhập liên quan đến các chức năng thông báo. Đặc biệt là NotificationCompat và TaskStackBuilder. Có vẻ như trong khi thiết lập mã của tôi ngay từ đầu, các lần nhập được thêm từ bản dựng mới hơn chứ không phải từ gói hỗ trợ. Sau đó, khi tôi muốn triển khai các mục này sau trong nhật thực, tôi không được nhắc nhập lại chúng. Hy vọng điều đó có ý nghĩa và nó sẽ giúp ích cho người khác :)


1

Nó hoạt động ngay cả trong API 8, bạn có thể sử dụng mã này:

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

Hoặc tôi khuyên bạn nên làm theo một hướng dẫn tuyệt vời về điều này


1

tôi đã sử dụng

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

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

Ví dụ khép kín

Kỹ thuật tương tự như trong câu trả lời này nhưng:

  • khép kín: sao chép dán và nó sẽ biên dịch và chạy
  • với một nút để bạn tạo bao nhiêu thông báo tùy thích và chơi với ý định và ID thông báo

Nguồn:

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

Đã thử nghiệm trong Android 22.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.