由于在Android 8.0之后,对通知进行过重大的调整和加入了一些新的功能,所以本篇文章将分别介绍,在Android 8.0中和在Android 8.0以下的版本中怎么使用通知,以及怎么在Android 8.0和Android 8.0以下的版本中兼容使用通知。
在Android 8.0以下的版本中使用通知,代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtn_Send_Notice;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn_Send_Notice = findViewById(R.id.btn_send_notification);
mBtn_Send_Notice.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_notification:
// 调用getSystemService()方法得到一个NotificationManager的实例
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Intent intent = new Intent(MainActivity.this, DisplayActivity.class);
// 设置一个待定意图,因为我们是在活动中跳转,所以使用getActivity()方法得到实例,在广播中和服务中应使用getBroadcast()和getService来得到实例
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
// 设置标题
builder.setContentTitle("这是标题");
// 设置内容
builder.setContentText("这是内容");
// 系统显示时间
builder.setWhen(System.currentTimeMillis());
// 设置收到通知后状态栏显示的小图标
builder.setSmallIcon(R.mipmap.ic_launcher);
// 设置收到通知后,通知右边显示的大图标
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
//设置点击通知后,取消通知
builder.setAutoCancel(true);
// 设置点击通知后要跳转的待定意图
// 因为我们上面设置了一个待定意图,设置跳转到另一个活动,意思就是点击通知后跳转的地方
builder.setContentIntent(pi);
// 通过调用NotificationCompat.Builder对象的build方法得到一个Notification的实例
Notification notification = builder.build();
// 发送通知,此处的1是id值,这个值可以自己随便取,但要全局唯一
manager.notify(1, notification);
break;
default:
}
}
}
这里我是设置了一个按钮,并通过点击按钮来发送一条通知,效果图如下:
以上程序只能在Android 8.0以下的版本中使用
在Android 8.0及以上版本中使用通知,代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtn_Send_Notice;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn_Send_Notice = findViewById(R.id.btn_send_notification);
mBtn_Send_Notice.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_notification:
// 调用getSystemService()方法得到一个NotificationManager的实例
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// 创建渠道
// 以下的message为渠道Id,通知消息为渠道名,这是给用户看的, NotificationManager.IMPORTANCE_HIGH为通知的重要等级
NotificationChannel channel = new NotificationChannel("message", "通知消息", NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
Intent intent = new Intent(MainActivity.this, DisplayActivity.class);
// 设置一个待定意图,因为我们是在活动中跳转,所以使用getActivity()方法得到实例,在广播中和服务中应使用getBroadcast()和getService来得到实例
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
// 此处的message为渠道Id,表示这个通知属于哪个渠道
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"message");
// 设置标题
builder.setContentTitle("这是标题");
// 设置内容
builder.setContentText("这是内容");
// 系统显示时间
builder.setWhen(System.currentTimeMillis());
// 设置收到通知后状态栏显示的小图标
builder.setSmallIcon(R.mipmap.ic_launcher);
// 设置收到通知后,通知右边显示的大图标
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
//设置点击通知后,取消通知
builder.setAutoCancel(true);
// 设置点击通知后要跳转的待定意图
// 因为我们上面设置了一个待定意图,设置跳转到另一个活动,意思就是点击通知后跳转的地方
builder.setContentIntent(pi);
// 通过调用NotificationCompat.Builder对象的build方法得到一个Notification的实例
Notification notification = builder.build();
// 发送通知,此处的1是id值,这个值可以自己随便取,但要全局唯一
manager.notify(1, notification);
break;
default:
}
}
}
现在运行一下代码,效果图如下:
与在Android 8.0以下的版本中使用通知的代码比较,你会发现,就多了一个渠道,没错,就是这个渠道。
从Android 8.0系统开始,Google引入了通知渠道这个概念。
什么是通知渠道呢?顾名思义,就是每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。
拥有了这些控制权之后,用户就再也不用害怕那些垃圾推送消息的打扰了,因为用户可以自主地选择自己关心哪些通知、不关心哪些通知。举个具体的例子,我希望可以即时收到支付宝的收款信息,因为我不想错过任何一笔收益,但是我又不想收到支付宝给我推荐的周围美食,因为我没钱只吃得起公司食堂。这种情况,支付宝就可以创建两种通知渠道,一个收支,一个推荐,而我作为用户对推荐类的通知不感兴趣,那么我就可以直接将推荐通知渠道关闭,这样既不影响我关心的通知,又不会让那些我不关心的通知来打扰我了。
对于每个App来说,通知渠道的划分是非常需要仔细考究的,因为通知渠道一旦创建之后就不能再修改了,因此开发者需要仔细分析自己的App一共有哪些类型的通知,然后再去创建相应的通知渠道。这里我们来参考一下微信的通知渠道划分:
可以看到微信划分了新消息通知和其他通知两个渠道
虽然通知渠道一旦创建之后就不能再修改了,但可以删除,这里给出删除的代码:
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.deleteNotificationChannel(channelId);
在Android 8.0和Android 8.0以下的版本中兼容使用通知
其实很简单,这里只要设置一个判断就可以了,判断当前系统是否在Android 8.0及以上,如果在Android 8.0及以上,就使用上面在Android 8.0及以上使用通知的代码,反之,则使用在Android 8.0以下的版本中使用通知的代码,代码如下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtn_Send_Notice;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn_Send_Notice = findViewById(R.id.btn_send_notification);
mBtn_Send_Notice.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_notification:
// 判断当前Android版本是否在8.0及以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// 此处使用Android 8.0及以上使用通知的代码
... ...
} else {
// 此处使用在Android 8.0以下的版本中使用通知的代码
... ...
}
break;
default:
}
}
}
这里我只给出示例的代码,上面写的非常清楚了,通知的简单使用就介绍到这里了。