安卓 O - 通知通道和通知兼容性

我无法改变这种感觉:再一次,Android开发人员提出了一些新的东西,让每个人都不知道他们会如何看待这个功能的使用。

我说的是Android O中的通知通道。

多年来,我一直在使用兼容性支持库来避免处理特定的平台详细信息。即:。NotificationCompat

现在,要求我提供通知通道ID,这很好,但完全让我独自创建这样的通道。我找不到任何兼容的创建频道支持。我也找不到一种合理的方法来在正确的位置创建它们。Builder

文档只是简单地指出,它应该在“某个地方”完成,并且“在发出通知时可能不会”。但是我到底应该做什么呢?我讨厌为简单的任务编写特定于版本的东西 - 这就是我使用兼容库的原因。

有没有人对如何处理它有任何建议?每次都希望显示通知时进行创建是否“昂贵”?


答案 1

这是我在Android O上生成通知并保持向后兼容性的解决方案:

        String idChannel = "my_channel_01";
        Intent mainIntent;

        mainIntent = new Intent(context, LauncherActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, mainIntent, 0);

        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationChannel mChannel = null;
        // The id of the channel.

        int importance = NotificationManager.IMPORTANCE_HIGH;

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context, null);
        builder.setContentTitle(context.getString(R.string.app_name))
                .setSmallIcon(getNotificationIcon())
                .setContentIntent(pendingIntent)
                .setContentText(context.getString(R.string.alarm_notification) + ManagementDate.getIstance().hourFormat.format(getAlarm(context, 0)));

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mChannel = new NotificationChannel(idChannel, context.getString(R.string.app_name), importance);
            // Configure the notification channel.
            mChannel.setDescription(context.getString(R.string.alarm_notification));
            mChannel.enableLights(true);
            mChannel.setLightColor(Color.RED);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
            mNotificationManager.createNotificationChannel(mChannel);
        } else {
            builder.setContentTitle(context.getString(R.string.app_name))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setColor(ContextCompat.getColor(context, R.color.transparent))
                    .setVibrate(new long[]{100, 250})
                    .setLights(Color.YELLOW, 500, 5000)
                    .setAutoCancel(true);
        }
        mNotificationManager.notify(1, builder.build());

答案 2

它并不像你想象的那么贵!您需要做的就是创建一个通知通道并将其绑定到通知。

您可以通过两种方式解决此问题,但对于这两种方式,您需要创建具有特定通道ID的通知通道。

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
String id = "my_channel_01";
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel(id, name,importance);
mChannel.enableLights(true);
mNotificationManager.createNotificationChannel(mChannel);

第一种方法是在构造函数中设置通知通道:

Notification notification = new Notification.Builder(MainActivity.this , id).setContentTitle("Title");
mNotificationManager.notify("your_notification_id", notification);

第二种方法是通过Notificiation.Builder.setChannelId()设置通道

Notification notification = new Notification.Builder(MainActivity.this).setContentTitle("Title").
setChannelId(id);
mNotificationManager.notify("your_notification_id", notification);

希望这有帮助


推荐