【Android】Android开发应用如何开启任务栏消息通知

news/2025/2/8 14:04:22 标签: android

Android开发应用如何开启任务栏消息通知

  • 1. 获取通知权限
  • 2.编写通知工具类
  • 3. 进行任务栏消息通知

1. 获取通知权限

在 AndroidManifest.xml 里加上权限配置,如下。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <!--  权限配置  -->
    <!--  通知栏信息权限  -->
    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

    <!--  下面是application配置  -->

</manifest>

可以在任意活动类中检查并申请相关权限

import android.content.pm.PackageManager;
import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.widget.Button;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.sda.R;

/**
 * @author pengYuJun
 */
public class MainActivity extends AppCompatActivity {

    /**
     * 通知权限自定义编码
     */
    private static final int NOTIFICATION_PERMISSION_CODE = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 调用父类的 onCreate 方法,以确保正确初始化活动
        super.onCreate(savedInstanceState);
        // 设置页面布局配置
        setContentView(R.layout.activity_main);

        // 检查权限,并申请
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            checkPermission();
        }
    }

    /**
     * 检查并请求所需权限
     */
    @RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
    private void checkPermission(){
        // 检查通知权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
            // 请求权限
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.POST_NOTIFICATIONS}, NOTIFICATION_PERMISSION_CODE);
        }
    }

    /**
     * 权限请求结果返回
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (grantResults.length == 0){
            return;
        }
        if (requestCode == NOTIFICATION_PERMISSION_CODE) {
            if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
                // 权限被拒绝,显示提示信息
                Toast.makeText(this, "申请通知权限被拒绝", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

2.编写通知工具类

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.graphics.BitmapFactory;
import android.os.Build;

import androidx.core.app.NotificationCompat;

import com.example.sda.R;
import com.example.sda.activity.MainActivity;

/**
 * @author pengYuJun
 */
public class NotificationUtils {
    public static void showNotification(Context context, String title, String content) {
        NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        String channelId = context.getResources().getString(R.string.app_name);
        String channelName = context.getResources().getString(R.string.app_name);

        // 创建通知渠道(仅在 API 级别 26 及更高版本中需要)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    channelId,
                    channelName,
                    NotificationManager.IMPORTANCE_HIGH // 使用高重要性
            );
            // 注册渠道
            manager.createNotificationChannel(channel);
        }

        // 通知点击的跳转页面
        Intent intentTarget = new Intent(context.getApplicationContext(), MainActivity.class);
        intentTarget.putExtra("xxx","xxx");
        intentTarget.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intentTarget, PendingIntent.FLAG_IMMUTABLE);

        // 创建通知
        Notification notification = new NotificationCompat.Builder(context, channelId)
                .setContentTitle(title)
                .setContentText(content)
                .setContentIntent(pendingIntent)
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.drawable.icon_app)
                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_app))
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setPriority(NotificationCompat.PRIORITY_HIGH) // 使用高优先级
                .build();

        // 获取当前时间戳(毫秒),作为通知Id
        long currentTimeMillis = System.currentTimeMillis();
        // 将时间戳转换为 int 类型
        int notifyId = (int) (currentTimeMillis % Integer.MAX_VALUE);
        // 发送通知
        manager.notify(notifyId, notification);
    }
}

注意,当版本高时,创建通知渠道,需要使用高重要性: NotificationManager.IMPORTANCE_HIGH,这样通知会弹出悬挂横幅弹窗。若版本低时,则需要高优先级:setPriority(NotificationCompat.PRIORITY_HIGH)。当不需要弹出悬挂横幅弹窗时,默认重要性、默认优先级即可。

再注意,每次改变重要性、优先级这些,需要卸载app再重新安装才能生效。至少在笔者2025/2/7开发时,为如此。

其他配置可自行根据需求探索。

3. 进行任务栏消息通知

NotificationUtils.showNotification(getApplicationContext(), "title", "message");

http://www.niftyadmin.cn/n/5844932.html

相关文章

【unity小技巧】分享vscode如何进行unity开发,且如何开启unity断点调试模式,并进行unity断点调试(2025年最新的方法,实测有效)

文章目录 前言一、前置条件1、已安装Visual Studio Code&#xff0c;并且unity首选项>外部工具>外部脚本编辑器选择为Visual Studio Code [版本号]&#xff0c;2、在Visual Studio Code扩展中搜索Unity&#xff0c;并安装3、同时注意这个插件下面的描述&#xff0c;需要根…

Rust语言进阶之标准输出:stdout用法实例(一百零六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

5.2Internet及其作用

5.2.1Internet概述 Internet称为互联网&#xff0c;又称英特网&#xff0c;始于1969年的美国ARPANET&#xff08;阿帕网&#xff09;&#xff0c;是全球性的网络。 互连网指的是两个或多个不同类型的网络通过路由器等网络设备连接起来&#xff0c;形成一个更大的网络结构。互连…

备战蓝桥杯:二维前缀和之激光炸弹

由于xi yi在0到5000之间&#xff0c;我们之前学的前缀和模板都是从下标1开始&#xff0c;我们就把x和y各自加1就好了&#xff0c;也就是在1到5001之间了&#xff0c;题目又说了&#xff0c;同一位置可能有多个目标&#xff0c;所以我们在一个位置求价值的时候应该用加等来求和 …

makefile 的strip,filter,ifeq,ifneq基础使用

目录 一、strip1.1 语法1.2 示例1.3 使用场景 二、filter2.1 语法2.2 示例2.3 使用 * 和 ? 通配符2.4 结合使用2.5 使用场景 三、ifeq 和 ifneq3.1 ifeq3.1.1 语法3.1.2 示例 3.2 ifneq3.2.1 语法3.2.2 示例 3.3 典型使用场景3.3.1 根据版本控制编译选项:3.3.2 选择不同的源文…

关于 SQL 内连接、外连接(左连接、右连接)的面试题

一、概念理解类 1. 请详细解释内连接&#xff08;INNER JOIN&#xff09;、左连接&#xff08;LEFT JOIN&#xff09;、右连接&#xff08;RIGHT JOIN&#xff09;在 SQL 中的概念和区别&#xff0c;并分别举例说明它们在实际查询场景中的应用。 在SQL中&#xff0c;内连接&a…

Vue:Table合并行于列

<template><div><el-table:data"tableData":span-method"mergeCells"style"width: 100%"><el-table-columnprop"date"label"日期"width"180"></el-table-column><el-table-colu…

Flutter List 的 every 如果回调函数抛出异常 应该如何处理

在使用 List 的 every 方法时&#xff0c;如果回调函数抛出异常&#xff0c;可以通过以下几种方式进行处理&#xff1a; 1. 在回调函数内部捕获异常 在回调函数内部使用 try-catch 语句捕获可能抛出的异常&#xff0c;并根据具体情况进行处理。这样可以避免异常直接导致 ever…