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);
相关推荐
小妖66632 分钟前
怎么用 tauri 创建编译 android 应用程序
android·tauri
鸟儿不吃草2 小时前
安卓实现左右布局聊天界面
android·开发语言·python
xxjj998a3 小时前
Laravel 1.x:PHP框架的原始魅力
android·php·laravel
formula100003 小时前
在iOS/安卓上远程连接任何 Agent!Claude、Codex、Copilot、Gemini、OpenCode 等
android·copilot
该用户可能存在3 小时前
Blbl-android 更新至 v0.1.24,体验更流畅、更稳定
android·哔哩哔哩·电视app·androidtv·bbll·blbl·bilibilitv
lKWO OMET4 小时前
mysql之字符串函数
android·数据库·mysql
liang_jy14 小时前
Android SparseArray
android·源码
liang_jy15 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
NPE~16 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心16 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android