通知(notification)是Android系统中比较有特色的一个功能,当某个应用程序希望向用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知后,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。
修改activity_main.xml,仅仅加入了一个按钮用于发送通知
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/send_notification"
android:text="Send Notification"
android:textAllCaps="false" />
</LinearLayout>
修改MainActivity.java:
package com.example.notificationtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: execute");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个NotificationManager对通知进行管理
NotificationManager manager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
//创建channel
NotificationChannel channel = new NotificationChannel("normal", "channelName",
NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
//定义点击事件:
Button buttonSendNotification = findViewById(R.id.send_notification);
buttonSendNotification.setOnClickListener(v -> {
Notification notification = new NotificationCompat.Builder(this, "normal")
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setAutoCancel(true)
.build();
Log.d(TAG, "onCreate: notify successfully");
manager.notify(100, notification);
});
}
}
首先需要NotificationManager实例来管理通知,调用Context 的getSystemService()方法获取。getSystemService()方法接收一个字符串参数用于确定获取系统的哪个服务, 这里我们传入Context.NOTIFICATION_SERVICE 即可。
接下来使用NotificationChannel类构建一个通知channel,并调用NotificationManager的
createNotificationChannel()方法完成创建。由于NotificationChannel类和createNotificationChannel()方法都是Android 8.0系统中新增的API,因此在使用时还需进行版本判断。createNotificationChannel()创建一个通知channel至少需要channel ID、channel 名称以及重要等级3个参数,其中ID可以随便定义,但保证全局唯一性。名称是展示给用户看的,需要清楚地表达channel的用途,重要等级主要有IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN这几种,对应的重要程度依次从高到低。不同的重要等级会决定通知的不同行为。
创建通知的详细步骤: 使用Notificationcompat类的Bulder构造器来创建Notification对象,NotificationCompat.Builder构造函数接收两个参数:第一个参数是context;第二个是channel ID,需要和我们在创建通知channel 时指定的渠道ID相匹配。可以在最终的build()方法之前连缀任意多的设置方法来创建一个丰富的Notification对象。setContentTitle()方法用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。setContentText()方法用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容。setSmallIcon()方法用于设置通知的小图标,只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上。setLargeIcon()方法用于设置通知的大图标,下拉系统状态栏时,就可以看到设置的大图标。setWhen()设置通知被创建的时间,默认值是System.currentTimeMillis()。
以上工作完成后,只需调用NotificationManager的notify()方法就可以让通知显示出来。notify()方法接收两个参数:第一个参数是id,要保证为每个通知指定的id都是不同的;第二个参数是Notification对象,这里直接将创建好的Notification对象传入即可。
点击Send Notification按钮可以看到弹出了提示,下拉状态栏也可以看到通知。
以上即Notification的简单用法。