究竟如何使用Notification.Builder


100

我发现我正在使用不推荐使用的方法进行通知(notification.setLatestEventInfo())

它说要使用Notification.Builder。

  • 如何使用?

当我尝试创建一个新实例时,它告诉我:

Notification.Builder cannot be resolved to a type

我注意到可以从API Level 11(Android 3.0)开始使用。
mobiledev亚历克斯2011年

Answers:


86

是API 11中的功能,因此,如果您要开发3.0之前的版本,则应继续使用旧的API。

更新:NotificationCompat.Builder类已添加到支持包中,因此我们可以使用它来支持API级别v4及更高版本:

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


谢谢。我想知道为什么在功能页面本身上没有提到这一点
Saariko 2011年

15
是的:我认为弃用警告还为时过早,但我知道什么。
Femi

152

Notification.Builder API 11NotificationCompat.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 2012年

6
我认为有人应该告诉Google他们在Notification.Builder文档页面上有严重的错别字。我正在做他们在说的话,但这没有任何意义。我来到这里,发现情况有所不同。非常感谢您的回答,因为它使我意识到了文档上的错误。
安迪

5
说明文件builder.getNotification()已弃用。它说你应该使用builder.build()
mneri

26
NotificationBuilder.build()需要API级别16或更高。API级别11和15之间的任何值都应使用NotificationBuilder.getNotification()。
卡米尔·塞维尼(CamilleSévigny)2012年

4
@MrTristan:由于书面的文档中,setSmallIcon()setContentTitle()setContentText()是最低要求。
caw 2014年

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)您需要为“ ic_launcher”制作一个32x32的图标。透明背景上的白色绘图2)您需要为int FM_NOTIFICATION_ID = [yourFavoriteRandom]定义一些随机数;
Anders8 2015年

1
非常感谢您,我的问题是:当我第二次单击通知时,先前的片段已打开,而这一行“ PendingIntent.FLAG_UPDATE_CURRENT”解决了我的问题,使我感到高兴
Shruti

4

Notification Builder严格适用于Android API级别11及更高版本(Android 3.0及更高版本)。

因此,如果您不以Honeycomb平板电脑为目标,则不应使用Notification Builder,而应遵循以下示例中的较早的通知创建方法。


4
您可以使用兼容性库,因此可以在API 4或更高版本上使用它。
Leandros 2012年

3

更新android-n(2016年3月)

请访问通知更新链接以获取更多详细信息。

  • 直接回覆
  • 捆绑通知
  • 自定义视图

Android N还允许您将类似的通知捆绑在一起以显示为单个通知。为了实现这一点,Android N使用现有的NotificationCompat.Builder.setGroup()方法。用户可以分别从通知栏扩展每个通知,并对每个通知执行诸如回复和关闭之类的操作。

这是一个预先存在的示例,显示了一个简单的服务,该服务使用NotificationCompat发送通知。来自用户的每个未读会话将作为不同的通知发送。

此示例已更新,以利用Android N中可用的新通知功能。

样例代码


嗨,在这里,您能告诉我们使用downloader_library时如何使此方法在Android 6.0上运行吗?我使用的是Eclipse SDK-25.1.7 || 遗憾的是,ADT 23.0.X || Google APK扩展库和许可库都为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()

基本上我错过了其中之一。以此作为进行故障排除的基础,请确保至少具有所有这些。希望这将使其他人免于头痛。


因此,如果您认为:“我稍后会找到图标”,您将不会得到任何通知。谢谢你这个;)
Nanne 2015年

1

万一它对任何人都有帮助...在针对较新的较旧API进行测试时,使用支持包设置通知时会遇到很多麻烦。我能够让他们在较新的设备上工作,但会在旧设备上进行错误测试。最终对我有用的是删除所有与通知功能相关的导入。特别是NotificationCompat和TaskStackBuilder。似乎在开始设置代码时,是从较新版本而不是从支持包中添加的导入。然后,当我想稍后在Eclipse中实现这些项目时,没有提示我再次导入它们。希望这是有道理的,并且可以帮助其他人:)


1

即使在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);

或者,我建议遵循有关此内容的出色教程


1

我用过了

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

独立的例子

该答案相同的技术,但:

  • 自包含:复制粘贴,它将编译并运行
  • 带有一个按钮,您可以根据需要生成尽可能多的通知,并使用意图和通知ID进行播放

资源:

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上测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.