发表于: 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(1, notification); //发出通知,参数:为通知指定的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(1, notification); //发出通知,参数:为通知指定的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 context, String title,
String content, int progress) {
int notificationId = 1;
Intent intent = new Intent(context, SettingActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
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(100, progress, false);
}
NotificationManager notificationManager
= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.build());
}
@RequiresApi(api = Build.VERSION_CODES.O)public static void showLowNotification(Context context, String title,
String content, int progress) {
int notificationId = 0;
Intent intent = new Intent(context, SettingActivity.class);
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
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(100, progress, false);
}
NotificationManager notificationManager
= (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(notificationId, builder.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,需要做好适配工作。
评论