IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Notification-通知 -> 正文阅读

[移动开发]Notification-通知

Notification-通知

通知是一种消息,这种消息呈现在应用UI之外,通过通知可以对用户进行提醒、可以和其他用户收发信息等。通过点击通知,可以唤起app页面或者直接在通知上执行一些操作。下面介绍通知的一些常用用法。

展示一条普通通知

先来看一个效果:image.png

从这张截图上,可以看到有一条通知消息,如果要实现这个效果,参考以下实现逻辑:

private static final String CHANNEL_ID_1 = "CHANNEL_ID_1";

public void doNotify(View v) {
    NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID_1, CHANNEL_NAME_1, NotificationManager.IMPORTANCE_DEFAULT);
        notificationManagerCompat.createNotificationChannel(channel);
    }

    final String content = "独行侠大胜太阳拖入“抢七” 热火击败76人挺进东决";
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID_1);
    builder.setSmallIcon(android.R.drawable.ic_dialog_alert)
            .setContentTitle("通知标题")
            .setContentText(content)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT);

    final int notificationId = 101;
    notificationManagerCompat.notify(notificationId, builder.build());
}

这里有几点需要说明:

  1. NotificationManagerCompat是对NotificationManager进行了版本差异化的封装,本质为(NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
  2. Android 8.0开始,发送任何通知前,都要先创建通知通道NotificationChannel;创建一个已存在的通知通道会被忽略,因此重复创建通知通道是安全;官方推荐是app启动时创建通道;
    创建通知通道NotificationChannel的参数需要注意2点:
    • channelId包内唯一;
    • important参数,不同级别对用户的提醒方式和打扰程度不同如声音等,详情可以参考NotificationManager中IMPORTANCE_*说明,这里使用默认important;
  3. 创建单个通知渠道notificationManagerCompat.createNotificationChannel(channel)实际执行了mNotificationManager.createNotificationChannel(channel)(除了提供创建单个通知渠道外,内部还提供了创建多个通知渠道的重载方法:public void createNotificationChannels(@NonNull List<NotificationChannel> channels));
  4. NotificationCompat.Builder: NotificationCompatNotification进行了版本差异化封装,采用建造者模式创建Notification;
    • builder.setSmallIcon(R.mipmap.ic_launcher): 设置通知小图标,这是一条通知的必须元素!
    • setPriority(NotificationCompat.PRIORITY_DEFAULT): 7.1及以下版本,通过此方法设置通知权重,即打扰用户程度;8.0及以上版本,需要用NotificationChannel来设置相关属性。
  5. notificationManagerCompat.notify(notificationId, builder.build()): 注意notificationId必须唯一,之后可对该通知进行更新,如下载进度更新;

这是一条最简单的通知,还没有给通知添加用户行为,下面对其增加点击交互。

通知点击交互

先看效果

untitled.gif

从图上可以看到,A页面只有一个发送通知的按钮,而在成功发送通知并点击通知后,A页面展示了通知上的内容,通知也随即消失。要实现这个功能,只需要改造上一节的实例代码如下:

  1. AndroidManifest.xml修改启动模式:android:launchMode="singleTop";

  2. doNotify()方法调整:

    public void doNotify(View v) {
            NotificationManagerCompat notificationManagerCompat = NotificationManagerCompat.from(this);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel(CHANNEL_ID_1, CHANNEL_NAME_1, NotificationManager.IMPORTANCE_DEFAULT);
                notificationManagerCompat.createNotificationChannel(channel);
            }
    
            final String content = "独行侠大胜太阳拖入“抢七” 热火击败76人挺进东决";
    
            Intent intent = new Intent(this, NotificationActivity.class);
            intent.putExtra("content", content);
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID_1);
            builder.setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("通知标题")
                    .setContentIntent(pendingIntent)
                    .setContentText(content)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                    .setAutoCancel(true);
    
            final int notificationId = 101;
            notificationManagerCompat.notify(notificationId, builder.build());
    }
    

    这里有几点需要说明:

    • PendingIntent: 将Intent封装为PendingIntent, 并且标记设置flagsPendingIntent.FLAG_UPDATE_CURRENT用以设置Intent中的额外参数;
    • 如果将flags设置为PendingIntent.FLAG_IMMUTABLE,则intent中的附加参数将不会生效;
  3. Activity中增加onNewIntent()回调逻辑:

    protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            if (intent.hasExtra("content")) {
                ((TextView) findViewById(R.id.tv_notification_content)).setText(intent.getStringExtra("content"));
            }
    }
    

    上面的例子中,可以发现消息内容被截取成了单行显示,接下来展示如何显示完整的消息。

可收起和展开的消息

文本消息:

看效果

Screenshot_1652103479.png Screenshot_1652103483.png

要实现可展开收起的消息比较简单,在上述代码基础上添加一行代码即可setStyle(new NotificationCompat.BigTextStyle().bigText(content))

...

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID_1);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), android.R.drawable.star_big_on);
builder.setSmallIcon(android.R.drawable.stat_notify_chat)
        .setLargeIcon(bitmap)
        .setContentTitle("通知标题")
        .setContentText(content)
        .setStyle(new NotificationCompat.BigTextStyle().bigText(content))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

final int notificationId = 101;
notificationManagerCompat.notify(notificationId, builder.build());
...

这里还增加了setLargeIcon(bitmap)来设置通知的大图标。

图片通知

类似的还可以设置一张可收起展开的图片通知,设置style:setStyle(new NotificationCompat.BigPictureStyle().bigLargeIcon(null).bigPicture(bitmap))

Screenshot_1652103750.png

以上就是通知的常用场景,当然通知还有一些高级用法,比如和前台服务结合的下载进度条、媒体控制等。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:23:47  更:2022-05-16 11:24:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:47:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码