先上代码
MainActivity
/*
* 发送通知的步骤
* 1.创建一个频道,需要id,name,importance三个参数
* 2.创建一个NotificationManager,然后create上面的频道
* 3.创建一个Notification,中间设置内容标题啥的,一定要setChannelId()。获取Notification实例用new Notification.Builder创建。
* 4.用创建一个NotificationManager的notify发送通知
* */
public class MainActivityextends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification);
Button button=findViewById(R.id.btn_notifaction);
button.setOnClickListener(this);
}
@Override
public void onClick(View view) {
sendNotification();
}
@TargetApi(26)
private void sendNotification() {
String id="channel_01";
String name="channel_01";
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel=new NotificationChannel(id,name,importance); //android8.0以后需要channel
channel.setDescription("hello");// 配置通知渠道的属性
channel.enableLights(true); // 设置通知出现时的闪灯(如果 android 设备支持的话)
channel.setLightColor(Color.RED);
channel.enableVibration(true); // 设置通知出现时的震动(如果 android 设备支持的话)
channel.setVibrationPattern(new long[]{100,200,300,400,500,400,300,200,400});
NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel); //在notificationManager中创建该通知渠道
Notification notification=new Notification.Builder(this).setContentTitle("标题")
.setContentText("内容")
.setSmallIcon(android.R.drawable.stat_notify_more) //图标
.setAutoCancel(true)//点击后自动消失
.setChannelId(id) //设置channel
.build();
notificationManager.notify(1,notification);
}
}
activity_notification.xml
其他的没什么好说的,从方法开始。
@TargetApi:
当你使用一个较高版本才有的api(比工程中的minSdkVersion高)时,编译器会报错,@TargetApi和@RequiresApi可以让代码编译通过。例如我把我minSDK改成22
那么会报错
NotificationChannel(id,name,importance)有三个参数,分别为ID,名字,重要度。重要度分为:
IMPORTANCE_NONE 关闭通知
IMPORTANCE_MIN 开启通知,不会弹出,但没有提示音,状态栏中无显示
IMPORTANCE_LOW 开启通知,不会弹出,不发出提示音,状态栏中显示
IMPORTANCE_DEFAULT 开启通知,不会弹出,发出提示音,状态栏中显示
IMPORTANCE_HIGH 开启通知,会弹出,发出提示音,状态栏中显示
NotificationManager:
是状态栏通知的管理类,负责发通知、清楚通知等。 NotificationManager是一个系统Service,必须通过getSystemService()方法来获取。
效果展示:
PendingIntent 是一种特殊的 Intent, 作用和 Intent 一样是用于启动一个 Activity或者Service,或发送一条 Broadcast。通知响应用户动作便是用这个, 当对通知做出一个动作后,系统便会调用 PendingIntent,启动一个活动,服务或广播,这取决于你获取的是那种 PendingIntent。
在 PendingIntent 中传入的 Context 销毁以后,PendingIntent 依旧有效,它一般使用在当 Context 销毁后需要执行 Intent的地方,一般不是用于立即执行的时候,比如在点击通知后唤醒一个 Activity。。
// 获取用于启动 Activity
PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags);
// 获取用于发送 Broadcast
PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags);
// 获取用于启动服务
PendingIntent.getService(Context context, int requestCode, Intent intent, int flags);
PendingIntent.getActivities(Context context, int reqeustCode, Intent[] intents, int flags);
PendingIntent.getForgroundService(Context, int reqeustCode, Intent intent, int flags)
各个参数的用途分别如下
context, 当前上下文
requestCode, 请求标识,如果多次获取时这个值相同,则返回的结果与 flags 参数相关
intent, 请求意图
flags, 控制获取 PendingIntent 的方式,可选值如下
PendingIntent.FLAG_CANCEL_CURRENT,如果当前已存在则取消当前的并返回一个新的 PendingIntent
PendingIntent.FLAG_UPDATE_CURRENT,如果已存在则更新之前的
PendingIntent.FLAG_NO_CREATE,如果已存在则返回当前存在的,否则返回 null
PendingIntent.FLAG_ONE_SHOT,表明这个 PendingIntent 只能用一次,触发一次后自动 cancel
PendingIntent.FLAG_IMMUTABLE,表明这个PendingIntent 不可变
Notification使用PendingIntent跳转
代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=findViewById(R.id.btn_send);
button.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
public void onClick(View view) {
postNotification();
}
});
}
/*
* 发送通知的步骤
* 1.创建一个频道,需要id,name,importance三个参数
* 2.创建一个NotificationManager,然后create上面的频道
* 3.创建一个Notification,中间设置内容标题啥的,一定要setChannelId()。获取Notification实例用new Notification.Builder创建。
* 4.用创建一个NotificationManager的notify发送通知
* */
@RequiresApi(api = Build.VERSION_CODES.O)
private void postNotification() {
String id="channel01";
String name="频道1";
int importance= NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel=new NotificationChannel(id,name,importance); //频道
NotificationManager notificationManager= (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel); //注册频道
//PendingIntent
Intent intent=new Intent(MainActivity.this,PendingIntentActivity.class);
PendingIntent pi=PendingIntent.getActivity(MainActivity.this,0,intent,0);
Notification notification=new Notification.Builder(this).setContentTitle("通知") //配置通知
.setContentText("测试")
.setSmallIcon(R.mipmap.ic_launcher)
.setChannelId(id) //频道
.setContentIntent(pi) //PendingIntent
.build();
notificationManager.notify(1,notification);
}
}