发表于: 2018-10-28 10:14:04

0 917


一、今天完成的事情

    之前做的下载功能,在下载开的过程中会发出通知,下载过程中会有一个进度条,下载完成后响一声通知用户下载完成了,如果整个下载过程都用同一个Notification,那么在下载过程中进度条刷新一次(发出一个通知)铃声就会响一下,整个下载过程手机就会一直响个不停,如果在创建Notification的时候设置为静音,那么下载完成后用户会收不到提示音。原本我的想法是一开始将通知设置为静音,下载完成后再设为非静音,也就是调用builder的

setSound()方法。在Android8.0(API 26)之前是可以,但是在8.0之后新增了一个通知渠道

NotificationChannel提供统一的系统来帮助用户管理通知,问题就在这个新增的NotificationChannel上。

旧版本设置通知的流程:

//获取一个NotificationManager来对通知进行管理
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(context)
//<------
       .setContextTitle("title"//设置通知的标题
       .setContextText("text"//设置通知的内容
       .setWhen(System.currentTimeMillis()) //设置通知被创建的时间

       .setSmallIcon(R.drawable.android_white_18dp) 

        //设置通知显示在状态栏上的小图标(必须是纯alpha图层的图片)

       .set...//等等属性
       .build();
manager.notify(1notification)//发出通知,参数:为通知指定的id, Notification对象

Android8.0之后设置通知的流程:

//获取一个NotificationManager来对通知进行管理
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//创建NotificationChannel
NotificationChannel channel = new NotificationChannel("channelId",
       "channelName"NotificationManager.IMPORTANCE_DEFAULT);
   channel.setShowBadge(true)//长按图标时是否显示通知内容
   channel.enableLights(true)//设置通知来时,是否亮起呼吸灯
   channel.setLightColor(Color.GREEN)//设置呼吸灯颜色
   channel.setSound(null, null)//设置通知声音
   channel.set......  //设置等等属性
manager.createNotificationChannel(channel);//<------
Notification notification = new NotificationCompat.Builder(context,"channelId")//<------
       .setContextTitle("title"//设置通知的标题
       .setContextText("text"//设置通知的内容
       .setWhen() //设置通知被创建的时间
       .setSmallIcon() //设置通知显示在状态栏上的小图标(必须是纯alpha图层的图片)
       .set...//等等属性
       .build();
manager.notify(1notification)//发出通知,参数:为通知指定的id, Notification对象

NotificationChannel的id、name必须是不相同的,否则会造成混乱。

创建NotificationChannel时需要为其设置重要性importance(优先级)

NotificationChannel channel = new NotificationChannel(

                              "channelId", "channelName", NotificationManager.IMPORTANCE_DEFAULT);

重要性有五个等级(0~4):IMPORTANCE_UNSPECIFIED,  IMPORTANCE_NONE,  IMPORTANCE_MIN,  

                 IMPORTANCE_LOW,  IMPORTANCE_DEFAULT  或  IMPORTANCE_HIGH.

如果importance设为IMPORTANCE_LOW,那么发出的通知是静音的,即使在创建过程中设置了声音、震动参数,也就是说设置的非默认属性以importance为准。

NotificatinChannel也可以对声音、震动、呼吸灯、重要性(优先级)进行设置,系统会采用NotificationChannel中设置的参数,而不是

NotificationCampt.Builder中设置的参数。NotificationChannne在App中l创建完成后,通知声音不能关闭、通知铃声不能更改,以及震动、呼吸灯、优先级这些属性在Channel中都无法更改了,所有试图更改这些属性的方法都是无效的,这也就是前面为什么说Android8.0之前可以在中途更改通知的声音而8.0之后不行。

官方文档


解决方法:

(1)不适配Android8.0以后的系统(作为一个有理想的猿,肯定不能这么做

(2)通知都设成静音(省事,但是得看具体情况和需求,如果是一些重要通知肯定不行)

(3)为不同的通知设置不同的NotificationChannel

创建一个工具类MyNotufucationManager

public class MyNotificationManager {
private static final String TAG "MyNotificationManager";

   @RequiresApi(api = Build.VERSION_CODES.O)
   public static void initChannel(Context context) {
       NotificationManager notificationManager
           = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);

       //创建NotificationChannel  IMPORTANCE_DEFAULT
       NotificationChannel channel_download_default = new NotificationChannel(

             "importance_default""importance_default",

             NotificationManager.IMPORTANCE_DEFAULT);

       channel_download_default.setShowBadge(true)//长按图标时是否显示通知内容
       notificationManager.createNotificationChannel(channel_download_default);

       //创建NotificationChannel   IMPORTANCE_LOW
       NotificationChannel channel_download_low = new NotificationChannel(
              "importance_low""importance_low"NotificationManager.IMPORTANCE_LOW);
       channel_download_low.setShowBadge(true)//长按图标时是否显示通知内容
       notificationManager.createNotificationChannel(channel_download_low);
   }

   @RequiresApi(api = Build.VERSION_CODES.O)

   public static void showDefaultNotification(Context contextString title,

           String content, int progress) {

       int notificationId = 1;
       Intent intent = new Intent(contextSettingActivity.class);
       PendingIntent pi = PendingIntent.getActivity(context0intent0);
       NotificationCompat.Builder builder = new NotificationCompat.Builder(context,
               "importance_default");
       builder.setContentIntent(pi)
               .setContentTitle(title) //设置通知标题
               .setContentText(content) //设置通知内容
               .setWhen(System.currentTimeMillis()) //设置通知时间
               .setSmallIcon(R.drawable.android_white_18dp//设置通知图标
               .setAutoCancel(true)//点击通知后取消显示
       if (progress > 0) {
           builder.setContentText(progress + "%");
           builder.setProgress(100progress, false);
       }
       NotificationManager notificationManager
           = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
           notificationManager.notify(notificationIdbuilder.build());
   }

   @RequiresApi(api = Build.VERSION_CODES.O)

   public static void showLowNotification(Context contextString title

        String content, int progress) {

   int notificationId = 0;
       Intent intent = new Intent(contextSettingActivity.class);
       PendingIntent pi = PendingIntent.getActivity(context0intent0);
       NotificationCompat.Builder builder = new NotificationCompat.Builder(context,
               "importance_low");
       builder.setContentIntent(pi)
               .setContentTitle(title) //设置通知标题
               .setContentText(content) //设置通知内容
               .setWhen(System.currentTimeMillis()) //设置通知时间
               .setSmallIcon(R.drawable.android_white_18dp//设置通知图标
               .setAutoCancel(true)//点击通知后取消显示
       if (progress > 0) {
           builder.setContentText(progress + "%");
           builder.setProgress(100progress, false);
       }
       NotificationManager notificationManager
           = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
           notificationManager.notify(notificationIdbuilder.build());
   }
}

这里创建了两个NotificationChannel,两者的importance不同,一个是DEFAULT,默认有声音提示(无法更改),另一个是LOW,默认静音(无法更改)

这里也可以创建其他的NotificationChannel,根据需要做一些自定义的设置。

使用时:

先初始化NotificationChannel

public void onCreate() {
   super.onCreate();
   if (Build.VERSION.SDK_INT >= 26) {
       MyNotificationManager.initChannel(this);
   }
}

创建静音的通知

if (Build.VERSION.SDK_INT >= 26) {

    MyNotificationManager.showLowNotification(DownloadService.this,

          "正在下载..."""progress);

else {
    //使用Android 8.0之前创建通知的方法
}

创建带声音的通知

if (Build.VERSION.SDK_INT >= 26) {

    MyNotificationManager.showDefaultNotification(DownloadService.this, 

          "正在下载..."""progress);

else {
    //使用Android 8.0之前创建通知的方法
}


二、明天计划的事情

     开始任务六,写页面,确定跳转逻辑


三、遇到的问题 


四、收获

     对服务和通知有了进一步了解,尤其是通知,8.0之后增加了一个NotificationChannel,需要做好适配工作。



返回列表 返回列表
评论

    分享到