安卓8.0以上要求必须创建渠道才能显示通知。创建渠道不一定非要在展示通知的时候做,同一个渠道只需要被创建一次即可(多次亦可)。
NotificationChannel channel = new NotificationChannel(channelId,getResources()
.getString(R.string.app_name),NotificationManager.IMPORTANCE_HIGH);
参数分别为 渠道ID,获取App名、
第三个参数为:
IMPORTANCE_HIGH 收到通知发出提示语,并且会浮动提示用户(紧急)
IMPORTANCE_DEFAULT 收到通知发出提示语,不会浮动提示(高)
IMPORTANCE_LOW 收到通知不会发出声音,状态栏有小图标展示(中)
IMPORTANCE_MIN 看不到通知,可以用于禁用通知的场景(低)
强制删除渠道:
删除渠道的方法 deleteNotificationChannel()
NotificationManager manager = (NotificationManager) getSystemService(Context
.NOTIFICATION_SERVICE);
notificationManager.notify(1,notification);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("测试通知标题") //设置标题
.setContentText("测试通知内容") //设置内容
.setWhen(System.currentTimeMillis()) //设置时间,通知产生的时间,会在通知信息里显示
.setSmallIcon(R.mipmap.ic_launcher) //设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) //设置大图标
.setOngoing(false);//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_ALL);//向通知添加声音、闪灯和振动效果
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))) //图片通知
.setStyle(new NotificationCompat.BigTextStyle().bigText("长文字")) //显示长字符
通知栏中该通知会变为不会随着点击或者滑动而删除。除非该service结束停止,这个通知也会随之被删除。
第一个参数是ID,保证每个通知所指定的ID都不是一样的,第二个参数是notification对象
startForeground(222, mBuilder.build())
通知栏中该通知会随着点击或者滑动而删除。
参数是:是否删除之前发送的通知,true:删除。false:不删除 (用手滑动或者点击通知会被删除)
stopForeground(true);
PendingIntent的用法:
1>通过getActivity()、getBroadcast()、getService()方法获取实例
2>、参数(Context context, int requestCode, Intent intent, int flags)
第一个参数:Context
第二个参数:requestCode 一般用不到 ,通常设为0
第三个参数:intent
第四个参数:flags 用于确定PendingIntent的行为。通常设为0
调用.setContentIntent( )进行使用
Intent intent1 = new Intent(this,MainActivity.class);
PendingIntent pi1 = PendingIntent.getActivity(this,0,intent1,0);
?
需要注意的是:服务长期不使用会被后台回收。
写入onStartCommand中,即在服务每次启动的时候都会被调用。
- 方法一和二的区别:
在老的版本中是使用Notification
新的版本是使用Notification.Builder
为了兼容性现在使用NotificationCompat.Builder
Intent intent1 = new Intent(this,MainActivity.class);
//从下拉框点击service进入界面
PendingIntent pi1 = PendingIntent.getActivity(this,0,intent1,0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
getApplicationContext());
mBuilder.setContentText("测试");
mBuilder.setContentTitle("测试");
mBuilder.setSmallIcon(R.drawable.icon);//设置小图标
mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icon));
mBuilder.setWhen(System.currentTimeMillis());//通知产生的时间,会在通知信息里显示
mBuilder.setPriority(Notification.PRIORITY_DEFAULT);//设置该通知优先级
mBuilder.setOngoing(false);//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
mBuilder.setDefaults(Notification.DEFAULT_ALL);//向通知添加声音、闪灯和振动效果
mBuilder.setContentIntent(pi1);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
//NotificationManager进行管理
NotificationManager manager = (NotificationManager) getSystemService(Context
.NOTIFICATION_SERVICE);
String channelId = "channelId" + System.currentTimeMillis();
NotificationChannel channel = new NotificationChannel(channelId, getResources()
.getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
mBuilder.setChannelId(channelId);
}
startForeground(222, mBuilder.build());
// 方法二
//通知跳转页面 从下拉框点击service进入界面
Intent intent2 = new Intent(this,MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent2,0);
//创建渠道
String channelId = "channelId" + System.currentTimeMillis();
NotificationChannel channel = new NotificationChannel(channelId,getResources()
.getString(R.string.app_name),NotificationManager.IMPORTANCE_HIGH);
//NotificationManager进行管理
NotificationManager notificationManager = (NotificationManager) getSystemService(
Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示
.setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级
.setSmallIcon(R.drawable.icon)//设置小图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.icon))
.setContentIntent(pi) //从下拉框点击service进入界面
.setChannelId(channel.getId()) //获取通道ID
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(
BitmapFactory.decodeResource(getResources(),R.drawable.icon)))//图片通知
.build();
startForeground(1,notification); // 开始前台服务 该通知也会变为不会随着点击或者滑动而删除
stopForeground(false); //结束前台服务 通知栏中该通知会随着点击或者滑动而删除
notificationManager.notify(1,notification); //显示通知
return super.onStartCommand(intent, flags, startId);
demo参考: