Android 通知栏使用总结

使用Android 通知栏时遇到不少问题:

第一个问题:

android.app.RemoteServiceException$ForegroundServiceDidNotStartInTimeException: Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{4e07b77 u0 com.one.browser/.service.DownloadService}

解决办法:

java 复制代码
    /**
     * 通知构造器发送通知
     */
    private void notifyNow() {
        builder = new NotificationCompat.Builder(DownloadService.this, "download")
                // 设置通知的标题
                .setContentTitle("软件更新中...")
                // 设置通知的图标
                .setSmallIcon(android.R.drawable.stat_sys_download)
                // 设置通知的优先级
                // 通知的优先级只在 Android 7.1(API 级别 25)及更低版本中起作用。在 Android 8.0(API 级别 26)及更高版本中,
                // 通知的优先级由通知渠道的重要性属性决定。因此,在 Android 8.0 及以上版本中,设置通知渠道的重要性属性(使用 setImportance() 方法)是更有效和推荐的做法。
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                // 设置通知在用户点击后自动取消
                .setAutoCancel(false)
                // 设置下载进度条
                .setProgress(100, 0, false)
                // 设置为自动取消
                .setAutoCancel(true);
        // 1、发送通知(一定要按照顺序)
        notificationManagerCompat.notify(1, builder.build());
        // 2、将服务设置为前台服务(一定要按照顺序)
        startForeground(1, builder.build());
    }

注意:解决这个问题的办法是添加 startForeground 这个函数

第二个问题:

当我在实现一个通知栏下载提示通知时,下载任务已经开始了但是通知栏要过5、6秒之后才有显示通知。

解决办法:

这个问题就是要按照第一个问题中的代码按照顺序执行就可以了

java 复制代码
        // 1、发送通知(一定要按照顺序)
        notificationManagerCompat.notify(1, builder.build());
        // 2、将服务设置为前台服务(一定要按照顺序)
        startForeground(1, builder.build());

第三个问题:

关于 通知栏实现所要用到的API问题

(1)NotificationManagerCompat (Android4版本以下通知管理器,也可以在4版本以上使用)

(2)NotificationCompat.Builder(通知构建器,所有Android版本都可以使用)

(3)NotificationChannel(Android8版本以上通知分组器)

(4)NotificationManager(Android4版本以上通知管理器)

AI的说法是这样的:

  • NotificationManagerCompat 是用于支持 Android 4 及更高版本的通知操作的向后兼容的通知管理类。
  • NotificationCompat.Builder 是一个辅助类,用于在所有 Android 版本上构建通知。
  • NotificationChannel 是用于在 Android 8 及更高版本中创建通知渠道的类,并将通知分组。
  • NotificationManager 是原生的通知管理类,适用于 Android 4 及更高版本,用于创建、显示、更新和取消通知。

这个具体我也搞不太懂官方搞这么多搭配使用干啥,具体的使用方法:

这个是Android 8以上的使用方法 NotificationManager

java 复制代码
// 创建 NotificationManager 对象
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// 创建通知渠道(仅适用于 Android 8.0 及更高版本)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    String channelId = "channel_id";
    CharSequence channelName = "Channel Name";
    String channelDescription = "Channel Description";
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    NotificationChannel notificationChannel = new NotificationChannel(channelId, channelName, importance);
    notificationChannel.setDescription(channelDescription);
    // 设置其他通知渠道属性
    // ...

    // 将通知渠道添加到 NotificationManager
    notificationManager.createNotificationChannel(notificationChannel);
}

// 创建通知
int notificationId = 1;
String channelId = "ID";
CharSequence title = "标题";
CharSequence content = "内容";
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(title)
        .setContentText(content)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);
// 设置其他通知属性
// ...

// 显示通知
// 1、发送通知(一定要按照顺序)
notificationManager.notify(1, builder.build());
// 2、将服务设置为前台服务(一定要按照顺序)
startForeground(1, builder.build());

Android 8以下的使用方法要将 NotificationManager 替换为 NotificationManagerCompat****就可以使用了。

第四个问题:

通知栏的优先级 就是 setPriority 在Android 8以上版本中好像不起作用了,被 NotificationChannel 给替代了,需要在观察一下。

java 复制代码
     NotificationChannel channel = new NotificationChannel("download", "下载", NotificationManager.IMPORTANCE_DEFAULT);
相关推荐
黄林晴6 分钟前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我14 分钟前
flutter 之真手势冲突处理
android·flutter
法的空间33 分钟前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止39 分钟前
深入解析安卓 Handle 机制
android
恋猫de小郭1 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech1 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831671 小时前
为何Handler的postDelayed不适合精准定时任务?
android
叽哥1 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
Cui晨1 小时前
Android RecyclerView展示List<View> Adapter的数据源使用View
android
氦客1 小时前
Android Doze低电耗休眠模式 与 WorkManager
android·suspend·休眠模式·workmanager·doze·低功耗模式·state_doze