写在前面
博主最近开始学习Android,会持续的将自己在学习过程当中所遇到的问题以及最后的解决办法分享出来,一方面当作对自己学习过程的一个见证,另一方面也希望能对某个时刻的你有所帮助。
问题描述
在自己测试一个简单的通知(Notification)的基本用法的时候,按照常规流程去构造出来一个通知
private void sendNotification(){
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
builder.setSmallIcon(R.drawable.ic_notice_small);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_notice_small));
builder.setWhen(System.currentTimeMillis());
builder.setContentTitle("content title");
builder.setContentText("content text");
builder.setSubText("sub text");
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID, builder.build());
}
像这个样子,然后就是一个button点击自己制造一个通知
然后自己惊讶的发现,欸???通知呢??
是的,啥也没有
问题来源
网上的教程里其实也都是这么一个过程,既然代码是一毛一样的,那问题就是在环境上了。
博主的测试机是Android o,也就是Android 8.0+。在Android8.0及以上的系统中,若是想要显示一个通知的话,是需要一个叫channel的东西的。channel就像是路一样,通知想要成功发出,就必须有一条路给它走。其实如果要是细心的话会发现在
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
的时候这个构造方法是不被建议使用的。另一个长得差不多的构造方法多了一个String参数chinnelId,这就是问题所在。
一个基本的解决方案
那当然是给你的这个通知去创建一个channel了,像这个样子
private static final String CHINNEL_ID = "channel id 1";
private static final String CHINNEL_NAME = "channel name 1";
private void createNotificationChannel(){
//这里判断一下,要是8.0以下就没必要用channel了
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//这个是必须的
NotificationChannel infoChannel = new NotificationChannel(CHINNEL_ID, CHINNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
//下面这些是一些附加的设置
infoChannel.setDescription("testChannel");
infoChannel.enableLights(false);
infoChannel.enableVibration(false);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(infoChannel);
}
}
好了,现在就有通知了~~~