通知notification

通知

权限: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);
        }
    }
}

另外一个随便一下就一个文本

效果:

猜你喜欢

转载自blog.csdn.net/weixin_64015266/article/details/140325031