通知
权限:manifest.xml,可以不提前写,后面写代码时显示缺少点击添加即可。
<uses-permission android:name="android.permission.VIBRATE"/>//振动权限 <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />//通知权限
通知用到的两个类: NotificationManager manager; Notification note;
主体内容:(振动可以在通道里设置也可以在通知样式里设置,设置一个就可以)
中间有一个权限申请,一般申请通知权限就可以,这会在下载打开后弹出跳窗申请权限
private NotificationManager manager;
private Notification note;
manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//利用PendingIntent,设置点击通知后跳转的页面
Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent pending=PendingIntent.getActivity(this,0,intent, PendingIntent.FLAG_IMMUTABLE);
/*//申请通知权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_CODE_POST_NOTIFICATIONS);
}
//申请振动权限,对我的手机版本没用申请不了,还是得去设置手动设置
if (ContextCompat.checkSelfPermission(this, Manifest.permission.VIBRATE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.VIBRATE},
REQUEST_CODE_VIBRATE);
}*/
//在Android 8之后通知要建立一个通知通道
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel channel=new NotificationChannel("hhhhh","hhhhhhh",
NotificationManager.IMPORTANCE_HIGH);
//注册震动
/*Vibrator vibrator=(Vibrator) getSystemService(Context.VIBRATOR_SERVICE);*/
// long[] vibrationPattern = {100, 200, 300, 400}; // 设置震动模式,参数为一个 long 类型数组,表示震动的时长和间隔
// 配置通知出现时的震动(如果 Android 设备支持的话)
//channel.enableVibration(true);
//channel.setVibrationPattern(vibrationPattern);
manager.createNotificationChannel(channel);
}
//设置通知样式
note=new NotificationCompat.Builder(this,"hhhhh")
.setContentTitle("hhhhhhh")
.setContentText("aaaaaaa")
.setSmallIcon(R.drawable.ic_launcher_background)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_foreground))
.setColor(Color.parseColor("#ff0000"))//设置小图标颜色
.setContentIntent(pending)//设置点击动作
.setAutoCancel(true)
.setVibrate(new long[] {0,300,500,700})//设置振动,但在高版本api里好像不管用
.build();
//发送通知
manager.notify(1,note);
//取消通知
manager.cancel(1);
振动器
前面对于通知振动的使用可能会在高版本的api里失效,可以使用振动器来实现
1.VibrationEffect.createOneShot(500,VibrationEffect.DEFAULT_AMPLITUDE)
VibrationEffect
是在 Android 8.0(API 26)引入的一个类,它允许你更灵活地控制设备的振动模式。你可以创建单次振动、定时振动、或者组合多个振动模式。
createOneShot(long milliseconds, int amplitude)
这个方法用于创建一个单次振动的效果。
- milliseconds:振动持续的时间,单位为毫秒。在这个例子中,振动持续 500 毫秒(0.5 秒)。
- amplitude:振动的强度。可以使用
VibrationEffect.DEFAULT_AMPLITUDE
,它会使用设备默认的振动强度。如果你想指定振动强度,值的范围是 1 到 255,其中 255 表示最大强度。创建了一个振动持续时间为 500 毫秒,振动强度为设备默认值的
VibrationEffect
对象。2. vibrator.vibrate(effect)
这是一个
Vibrator
类的实例,用于控制设备的振动功能。
vibrate(VibrationEffect effect)
这个方法接受一个
VibrationEffect
对象作为参数,并根据这个对象的配置触发相应的振动模式。3.Build.VERSION_CODES.S
- 意思:Android 12
- 版本号:API Level 31
4.Build.VERSION_CODES.O
- 意思:Android 8.0(Oreo)
- 版本号:API Level 26
//实现发一次通知,振动一次,针对不同的api
Vibrator vibrator;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
VibratorManager vibratorManager = (VibratorManager) getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
vibrator=vibratorManager.getDefaultVibrator();
}else{
vibrator=(Vibrator) getSystemService(VIBRATOR_SERVICE);
}
manager.notify(1,note);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
VibrationEffect effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE);
vibrator.vibrate(effect);
} else {
vibrator.vibrate(500);
}
记录一次实现:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
>
<Button
android:id="@+id/sendnotificaftion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示notification"
></Button>
<Button
android:id="@+id/closenotification"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关闭notification"
></Button>
</LinearLayout>
notification_activity.xml(点击通知后的跳转页面)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".NotificationActivity"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
></TextView>
</LinearLayout>
参考内容:
Android开发之Notification(实现消息弹窗、提示音以及点击事件)_qtandroid 系统消息提示-CSDN博客
MainActivity.java
package com.mystudy.notification;
import static android.content.ContentValues.TAG;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.os.VibratorManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.Manifest;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationCompat;
import androidx.core.content.ContextCompat;
public class MainAvtivity extends AppCompatActivity implements View.OnClickListener {
private NotificationManager manager;
private Notification note;
private static final int REQUEST_CODE_POST_NOTIFICATIONS = 1;
private static final int REQUEST_CODE_VIBRATE = 2;
private Button btn_show;
private Button btn_close;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_show=findViewById(R.id.sendnotificaftion);
btn_close=findViewById(R.id.closenotification);
btn_close.setOnClickListener(this);
btn_show.setOnClickListener(this);
manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
/*//申请通知权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.POST_NOTIFICATIONS},
REQUEST_CODE_POST_NOTIFICATIONS);
}
//申请振动权限,对我的手机版本没用申请不了,还是得去设置手动设置
if (ContextCompat.checkSelfPermission(this, Manifest.permission.VIBRATE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.VIBRATE},
REQUEST_CODE_VIBRATE);
}*/
//通知通道,设立振动模式没用
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannel channel=new NotificationChannel("ShadyPi","ShadyPi的博客针不戳",
NotificationManager.IMPORTANCE_HIGH);
//注册震动
/*Vibrator vibrator=(Vibrator) getSystemService(Context.VIBRATOR_SERVICE);*/
long[] vibrationPattern = {100, 200, 300, 400}; // 设置震动模式,参数为一个 long 类型数组,表示震动的时长和间隔
// 配置通知出现时的震动(如果 Android 设备支持的话)
channel.enableVibration(true);
channel.setVibrationPattern(vibrationPattern);
manager.createNotificationChannel(channel);
}
Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent pending=PendingIntent.getActivity(this,0,intent, PendingIntent.FLAG_IMMUTABLE);
note=new NotificationCompat.Builder(this,"ShadyPi")
.setContentTitle("帅气的宝藏博主")
.setContentText("ShadyPi")
.setSmallIcon(R.drawable.ic_launcher_background)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_foreground))
.setColor(Color.parseColor("#ff0000"))//设置小图标颜色
.setContentIntent(pending)//设置点击动作
.setAutoCancel(true)
.setVibrate(new long[] {0,300,500,700})//通过这里设置也没用
.build();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_POST_NOTIFICATIONS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Notification permission granted.");
} else {
Log.i(TAG, "Notification permission denied.");
}
}
if (requestCode == REQUEST_CODE_VIBRATE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Vibrate permission granted.");
} else {
Log.i(TAG, "Vibrate permission denied.");
}
}
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.sendnotificaftion){
//设置这个振动管理器,在静音模式下也能振动
Vibrator vibrator;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
VibratorManager vibratorManager = (VibratorManager) getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
vibrator=vibratorManager.getDefaultVibrator();
}else{
vibrator=(Vibrator) getSystemService(VIBRATOR_SERVICE);
}
manager.notify(1,note);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
VibrationEffect effect = VibrationEffect.createOneShot(500, VibrationEffect.DEFAULT_AMPLITUDE);
vibrator.vibrate(effect);
} else {
vibrator.vibrate(500);
}
}else {
manager.cancel(1);
}
}
}
另外一个随便一下就一个文本
效果: