59

我需要创建一个简单的通知,如果可能的话,它将与声音和图标一起显示在通知栏中?我还需要它与 Android 2.2 兼容,所以我发现 NotificationCompat.Builder 可以与 4 以上的所有 API 一起使用。如果有更好的解决方案,请随时提及。

4

8 回答 8

135

NotificationCompat.BuilderNotifications是在所有 Android 版本上创建的最简单方法。您甚至可以使用 Android 4.1 提供的功能。如果您的应用在 Android >=4.1 的设备上运行,则将使用新功能,如果在 Android <4.1 上运行,则通知将是一个简单的旧通知。

要创建一个简单的通知,只需执行以下操作(请参阅Android API Guide on Notifications):

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Hello World!")
    .setContentIntent(pendingIntent); //Required on Gingerbread and below

您必须至少设置smallIcon和。如果您错过了一个通知将不会显示。contentTitlecontentText

注意:在 Gingerbread 及以下您必须设置内容意图,否则IllegalArgumentException会抛出 a。

要创建不执行任何操作的意图,请使用:

final Intent emptyIntent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(ctx, NOT_USED, emptyIntent, PendingIntent.FLAG_UPDATE_CURRENT);

您可以通过构建器添加声音,即来自 RingtoneManager 的声音:

mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))

通过 NotificationManager 将 Notification 添加到 bar:

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(mId, mBuilder.build());
于 2012-12-16T14:36:09.957 回答
29

工作示例:

    Intent intent = new Intent(ctx, HomeActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder b = new NotificationCompat.Builder(ctx);

    b.setAutoCancel(true)
     .setDefaults(Notification.DEFAULT_ALL)
     .setWhen(System.currentTimeMillis())         
     .setSmallIcon(R.drawable.ic_launcher)
     .setTicker("Hearty365")            
     .setContentTitle("Default notification")
     .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
     .setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND)
     .setContentIntent(contentIntent)
     .setContentInfo("Info");


    NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, b.build());
于 2014-12-31T13:30:04.447 回答
10

在 android 8.0 中显示通知

@TargetApi(Build.VERSION_CODES.O)
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)

  public void show_Notification(){

    Intent intent=new Intent(getApplicationContext(),MainActivity.class);
    String CHANNEL_ID="MYCHANNEL";
    NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ID,"name",NotificationManager.IMPORTANCE_LOW);
    PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),1,intent,0);
    Notification notification=new Notification.Builder(getApplicationContext(),CHANNEL_ID)
            .setContentText("Heading")
            .setContentTitle("subheading")
            .setContentIntent(pendingIntent)
            .addAction(android.R.drawable.sym_action_chat,"Title",pendingIntent)
            .setChannelId(CHANNEL_ID)
            .setSmallIcon(android.R.drawable.sym_action_chat)
            .build();

    NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(notificationChannel);
    notificationManager.notify(1,notification);


}
于 2019-01-30T18:13:05.803 回答
8

我做了这个方法并且工作正常。(在安卓 6.0.1 中测试)

public void notifyThis(String title, String message) {
    NotificationCompat.Builder b = new NotificationCompat.Builder(this.context);
    b.setAutoCancel(true)
            .setDefaults(NotificationCompat.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setSmallIcon(R.drawable.favicon32)
            .setTicker("{your tiny message}")
            .setContentTitle(title)
            .setContentText(message)
            .setContentInfo("INFO");

    NotificationManager nm = (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE);
    nm.notify(1, b.build());
}
于 2017-02-08T20:33:23.523 回答
2

深度通知

代码

Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);

NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.drawable.your_notification_icon)
                        .setContentTitle("Notification Title")
                        .setContentText("Notification ")
                        .setContentIntent(pendingIntent );

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, mBuilder.build());

深度知识

可以使用通知构建通知。Builder 或 NotificationCompat.Builder 类。
但是,如果您想要向后兼容,您应该使用 NotificationCompat.Builder 类,因为它是v4 支持库的一部分,因为它负责为 API 4 及更高版本提供一致的外观和通知功能。

核心通知属性

一个通知有 4 个核心属性(3 个基本显示属性 + 1 个点击操作属性)

  • 小图标
  • 标题
  • 文本
  • 按钮点击事件(点击通知时的点击事件)

在 Android 3.0 及更高版本上,按钮单击事件是可选的。这意味着如果您的 minSdk 针对 Android 3.0 或更高版本,您可以仅使用显示属性构建通知。但是,如果您希望通知在 Android 3.0 之前的旧设备上运行,则必须提供 Click 事件,否则您将看到 IllegalArgumentException。

通知显示

通过调用 NotificationManger 类的 notify() 方法显示通知

通知()参数

通知方法有两种可用的变体

notify(String tag, int id, Notification notification)

或者

notify(int id, Notification notification)

notify 方法采用整数 id 来唯一标识您的通知。但是,您也可以提供一个可选的字符串标签,以便在发生冲突时进一步识别您的通知。

这种类型的冲突很少见,但假设您创建了一些库,而其他开发人员正在使用您的库。现在他们创建了自己的通知,并且不知何故您的通知和其他开发人员的通知 id 相同,那么您将面临冲突。

API 11 之后的通知(更多控制)

API 11 提供了对通知行为的额外控制

  • 通知关闭
    默认情况下,如果用户点击通知,则会执行分配的点击事件,但不会清除通知。如果你希望你的通知在什么时候被清除,那么你应该添加这个

    mBuilder.setAutoClear(true);

  • 防止用户关闭通知
    用户也可以通过滑动通知来关闭通知。您可以通过在构建通知时添加此默认行为来禁用此默认行为

    mBuilder.setOngoing(true);

  • 通知的定位
    您可以通过以下方式设置通知的相对优先级

    mBuilder.setOngoing(int pri);

如果您的应用程序在低于 11 的 API 上运行,那么您的通知将在没有上述附加功能的情况下工作。这是选择 NotificationCompat.Builder 而不是 Notification.Builder 的优势

API 16 之后的通知(更多信息)

随着 API 16 的引入,通知被赋予了如此多的新功能,
通知可以提供更多信息。
您可以将 bigPicture 添加到您的徽标中。假设您现在使用 mBuilder.setLargeIcon(Bitmap bitmap) 从某人那里收到一条消息,您可以显示该人的照片。因此,在状态栏中,您将在滚动时看到图标,您将看到人物照片代替图标。还有其他功能

  • 在通知中添加计数器
  • 第一次看到通知时的提示消息
  • 可扩展通知
  • 多行通知等
于 2018-03-09T04:51:32.327 回答
1

你可以试试这个代码,这对我来说很好:

    NotificationCompat.Builder mBuilder= new NotificationCompat.Builder(this);

    Intent i = new Intent(noti.this, Xyz_activtiy.class);
    PendingIntent pendingIntent= PendingIntent.getActivity(this,0,i,0);

    mBuilder.setAutoCancel(true);
    mBuilder.setDefaults(NotificationCompat.DEFAULT_ALL);
    mBuilder.setWhen(20000);
    mBuilder.setTicker("Ticker");
    mBuilder.setContentInfo("Info");
    mBuilder.setContentIntent(pendingIntent);
    mBuilder.setSmallIcon(R.drawable.home);
    mBuilder.setContentTitle("New notification title");
    mBuilder.setContentText("Notification text");
    mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

    NotificationManager notificationManager= (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(2,mBuilder.build());
于 2017-05-14T06:32:02.537 回答
1

制作通知的简单方法

 NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher) //icon
            .setContentTitle("Test") //tittle
            .setAutoCancel(true)//swipe for delete
            .setContentText("Hello Hello"); //content
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(1, builder.build()
    );
于 2018-05-31T23:06:28.303 回答
0

使用此代码

            Intent intent = new Intent(getApplicationContext(), SomeActvity.class);
            PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(),
                    (int) System.currentTimeMillis(), intent, 0);

            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(getApplicationContext())
                            .setSmallIcon(R.drawable.your_notification_icon)
                            .setContentTitle("Notification title")
                            .setContentText("Notification message!")
                            .setContentIntent(pIntent);

            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(0, mBuilder.build());
于 2017-07-17T12:00:23.260 回答