我拆过的坑cycx

查询一下!

【Bug】android.app.RemoteServiceException: Bad notification for startForeground:

后来上网搜了搜,发现是Android8.0对通知做了细分,引进了channel,这主要影响两个方面:

A。普通通知Notification;B。前台服务通知

A.普通通知Notification:

主要相对于传统的写法修改两处,步骤如下:

①在“NotificationManager”中设置添加“NotificationChannel”属性:

NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);// 【适配Android8.0】给NotificationManager对象设置NotificationChannelif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel channel = new NotificationChannel("notification_id", "notification_name", NotificationManager.IMPORTANCE_LOW);notificationManager.createNotificationChannel(channel);}

②在“Notification”中使用“setChannelId()”方法设置添加“channel_id”属性:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);......// 【适配Android8.0】设置Notification的Channel_ID,否则不能正常显示if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {builder.setChannelId("notification_id");}...builder.build();

其中,第①步骤中的“NotificationChannel”的构造函数中参数列表依次为:

【channel_id】唯一id,String类型;

【channel_name】对用户可见的channel名称,String类型;

【importance_level】通知的重要程度。

importance_level主要有七种层次:

IMPORTANCE_NONE:      (0)关闭通知。在任何地方都不会显示,被阻塞IMPORTANCE_MIN:          (1)开启通知。不弹出,不发提示音,状态栏中无显示IMPORTANCE_LOW:        (2)开启通知。不弹出,不发提示音,状态栏中显示IMPORTANCE_DEFAULT:(3)开启通知。不弹出,发出提示音,状态栏中显示【默认】IMPORTANCE_HIGH:       (4)开启通知。会弹出,发出提示音,状态栏中显示IMPORTANCE_MAX:        (5)开启通知。会弹出,发出提示音,可以使用full screen intents(比如来电)。重要程度最高IMPORTANCE_UNSPECIFIED:(-1000)表示用户未设重要值。该值是为了持久的首选项,且永不应该与实际通知相关联

B.前台服务通知:

前台服务可通过【startForeground()】方法在通知栏列出前台服务的通知,在传统的写法中类似于普通通知Notification的写法,但是不需要使用NotificationManager来管理显示通知。但是在Android8.0之后引入NotificationChannel之后,即使找不到NotificationManager的使用位置,也是要把【A.普通通知Notification---->①在“NotificationManager”中设置添加“NotificationChannel”属性】中的代码在执行【startForeground();】语句之前写出来。

Intent intent = new Intent(this, TestActivity.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);NotificationCompat.Builder builder = new NotificationCompat.Builder(this);builder.setSmallIcon(R.drawable.ic_launcher);builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));......// 【适配Android8.0】设置Notification的Channel_ID,否则不能正常显示if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {builder.setChannelId("notification_id");}......// 额外添加:// 【适配Android8.0】给NotificationManager对象设置NotificationChannelif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);NotificationChannel channel = new NotificationChannel("notification_id", "notification_name", NotificationManager.IMPORTANCE_LOW);notificationManager.createNotificationChannel(channel);}// 启动前台服务通知startForeground(1, builder.build());


  • 评论列表
  •  admin
     发布于 2023-01-10 11:51:07  回复该评论
  • 共享来源:https://blog.csdn.net/LJW874362735/article/details/100863117

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

Copyright Your WebSite.Some Rights Reserved.