android使用通知和快捷方式

1.权限

android 13版本 将通知改为运行时权限,需要向用户动态申请权限。

// 权限请求implementation 'com.guolindev.permissionx:permissionx:1.7.1'
2.通知工具类

通知了解:官网

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.os.Build
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import com.choryan.quan.videowzproject.R
import com.choryan.quan.videowzproject.activity.ActivityHome
import com.choryan.quan.videowzproject.activity.ActivityStart
import com.choryan.quan.videowzproject.base.AppBase
import com.choryan.quan.videowzproject.extension.ExtensionLog.log
import com.choryan.quan.videowzproject.net.ApiUtlis
import com.permissionx.guolindev.PermissionX/*** 描述:* 作者: shawn* 时间: 2024/6/311:55*/
object UtilNotification {const val scene_code_cid = "cid"const val scene_code_red = "getRedPackage"const val scene_code_custom = "custom"const val key_from = "fromNotification"private val context = AppBase.instanceprivate const val notification_id = 123private const val notification_channel_id = "channel_reward_user"private const val notification_channel_name = "channel_reward"private const val notification_channel_description = "让您获取更多奖励的通道"private var preSendTime: Long = 0Lprivate fun isFastSend(): Boolean {if (System.currentTimeMillis() - preSendTime < 500){return true}preSendTime = System.currentTimeMillis()return false}fun requestNotification(activityHome: ActivityHome,action: (Boolean) -> Unit) {PermissionX.init(activityHome).permissions(PermissionX.permission.POST_NOTIFICATIONS).onExplainRequestReason { scope, deniedList ->val message = "授予通知权限,防止您错过重要消息"scope.showRequestReasonDialog(deniedList, message, "允许", "拒绝")}.request { allGranted, grantedList, deniedList ->if (allGranted) {"通知权限已获取".log()} else {"通知权限被拒绝 $deniedList".log()}action.invoke(allGranted)}}fun createNotificationChannel() {// Create the NotificationChannel, but only on API 26+ because// the NotificationChannel class is not in the Support Library.if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val name = notification_channel_nameval descriptionText = notification_channel_descriptionval importance = NotificationManager.IMPORTANCE_HIGHval channel = NotificationChannel(notification_channel_id, name, importance).apply {description = descriptionText}channel.enableVibration(true)channel.vibrationPattern = longArrayOf(0)// Register the channel with the system.val notificationManager: NotificationManager =context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)}}fun sendNotification(sceneCode:String) {if (isFastSend()) {return}val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager// Get the layouts to use in the custom notification.val notificationLayout = getRemoteView(sceneCode)val notificationLayoutExpanded = getRemoteView(sceneCode)// Create an explicit intent for an Activity in your app.val intent = Intent(context, ActivityStart::class.java).apply {flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK}intent.putExtra(key_from, sceneCode)val pendingIntent: PendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)} else {val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_UPDATE_CURRENT else 0PendingIntent.getActivity(context, 0, intent, flag)}// Apply the layouts to the notification.val customNotification =NotificationCompat.Builder(context, notification_channel_id).setSmallIcon(R.mipmap.app_icon_yghj).setStyle(NotificationCompat.DecoratedCustomViewStyle()).setCustomContentView(notificationLayout).setCustomBigContentView(notificationLayoutExpanded).setContentIntent(pendingIntent)// Set the intent that fires when the user taps the notification..setAutoCancel(true).setPriority(NotificationManager.IMPORTANCE_HIGH).setCategory(NotificationCompat.CATEGORY_RECOMMENDATION).build()if (PermissionX.isGranted(context, PermissionX.permission.POST_NOTIFICATIONS)) {notificationManager.notify(notification_id, customNotification)} else {"发送通知,但是没有权限".log()}}private fun getRemoteView(sceneCode: String): RemoteViews {val remoteViews = RemoteViews(ApiUtlis.packageName, R.layout.notification_layout)when (sceneCode) {scene_code_cid -> {remoteViews.setImageViewResource(R.id.iv, R.drawable.ic_notification_1)}scene_code_red -> {remoteViews.setImageViewResource(R.id.iv, R.drawable.ic_notification_2)}else -> {remoteViews.setImageViewResource(R.id.iv, R.drawable.ic_notification_3)}}return remoteViews}
}
关于通知需要注意的地方:
  1. android 8.0以上需要创建通知渠道
  2. pendingIntent创建的flag,需要适配不同版本。传的flag不对,导致intent携带的数据不能获取到,从而无法处理额外的逻辑
  3. 从onCreate中获取点击通知传递的数据:val from = intent.getStringExtra(key)
 3.快捷方式
import android.content.Intent
import android.os.Build
import androidx.core.content.pm.ShortcutInfoCompat
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.drawable.IconCompat
import com.choryan.quan.videowzproject.R
import com.choryan.quan.videowzproject.activity.ActivityStart
import com.choryan.quan.videowzproject.base.AppBase/*** 描述:快捷方式* 作者: shawn* 时间: 2024/6/312:04*/
object UtilShortcut {val context = AppBase.instanceconst val action_key = "shortcut_action_key"const val action_id_1 = "shortcut_action_1"const val action_id_2 = "shortcut_action_2"fun initShortcut() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {val id1 = action_id_1val intent1 = Intent(Intent.ACTION_MAIN, null, context, ActivityStart::class.java)intent1.putExtra(action_key, id1)val short1 = ShortcutInfoCompat.Builder(context, id1)//唯一标识id.setShortLabel(context.getString(R.string.shortcut_label_1))//短标签.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_1))//图标//跳转的目标,定义Activity.setIntent(intent1).build()val id2 = action_id_2val intent2 = Intent(Intent.ACTION_MAIN, null, context, ActivityStart::class.java)intent2.putExtra(action_key, id2)val short2 = ShortcutInfoCompat.Builder(context, id2)//唯一标识id.setShortLabel(context.getString(R.string.shortcut_label_2))//短标签.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_2))//图标// 跳转的目标,定义Activity.setIntent(intent2).build()// 执行添加操作ShortcutManagerCompat.addDynamicShortcuts(context, mutableListOf(short1, short2))}}
}
点击快捷方式跳转:
//在onCreate中获取数据
val value = _intent.extras?.getString(UtilShortcut.action_key)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter基础 -- Flutter基础特性

目录 1. 一切都是 widget 1.1 UI 组件&#xff01;&#xff01;&#xff01; 1.2 架构设计 1.3 sdk 源码目录 1.4 widget 分类&#xff01;&#xff01;&#xff01; 参考文献 2. devTools 调试工具 2.1 启动调试器 2.2 布局面板 参考文献 3. 布局约束规则 3.1 让子…

亲,你有多久没有清理过你电脑的 DNS 缓存了?

最近明月因为工作关系更换了几次使用的电脑,期间就发现明明另一台电脑访问某个网址是正常,换一台电脑后就会出现无法访问的现象,并且用的还是同一个宽带网络,实在是太诡异了!后来还是突然想起来 DNS 缓存这个问题,立马清除了那台电脑的 DNS 缓存后,打不开的网址顺利的呈…

银河麒麟V10 sp1使用pyautogui进行屏幕截图报错

** Message: 13:47:21.044: Unable to use GNOME Shells builtin screenshot interface, resorting to fallback X11. screenshot pyautogui.screenshot() screenshot.save(file_name) 使用以上代码在Ubuntu22.04操作系统上进行截屏没有任何问题&#xff08;桌面环境GNOME&am…

FPGA PCIe PIO代码的学习

目录 背景 应用场景 代码架构分析 结论 背景 本项目是基于xinlinx官方的PCIe IP 7 series integrated block for PCI Express。根据官方的例程加上官方给的example&#xff0c;对代码进行分析。 应用场景 对一些速率要求不高的&#xff0c;比如IO操作&#xff0c;推荐使用…

对新手友好的最简单方便的本地项目关联git远程仓库教程

对新手友好的最简单方便的本地项目关联git远程仓库教程 前置条件1.本地项目2.gitee上创建同名项目 关联操作1.在本地进行clone远程仓库操作2.把本地项目下的目录和文件都复制到这个克隆自git的项目文件夹里面3.查看文件状态和提交文件 在我们创建项目时&#xff0c;一般都是在本…

ubuntu编译打包的时候不想要linux-image-unsigned-xxxx.deb

ubuntu内核源码编译的时候呢打包总是打成 linux-image-unsigned-xxxx.deb 不想要linux-image-unsigned-xxxx.deb 想要linux-image-xxxx.deb 修改 control-create #!/bin/bash. debian/debian.envvars=$1 any_signed=$2. $vars[ "$provides" != ] && pro…

QAnything-1.4.01.4.1版本更新!使用指北!

久等了各位&#xff01;时隔一个多月&#xff0c;我们在4月26日和5月20日接连发布了v1.4.0和v1.4.1两个版本&#xff0c;带来了问答性能&#xff0c;解析效果等多方面的改进&#xff0c;并新增了大量的新功能和新特性 详见&#xff1a;releases 以及 使用说明 最新特性表 开发…

13-至少有5名直接下属的经理(高频 SQL 50 题基础版)

13-至少有5名直接下属的经理 select name from Employee where id in (select managerId -- 查找大于5的经理idfrom Employeegroup by managerId -- 根据id分组having count(*)>5); -- 根据分组的数据进行求个数

java连接MySQL数据库

环境准备 JDK安装 Navicat MySQL安装 下载jar包 MySQL :: Download MySQL Connector/J (Archived Versions) 创建数据库 1. 打开Navicat 2. 新建数据库 3. 定义数据库名 4. 新建查询 运行如下代码创建表log CREATE TABLE log (user VARCHAR(255) NOT NULL UNIQUE,pwd …

mysql8 .net sqlsuger 批量插入dbScope.Fastest<T>().PageSize(2000).BulkCopy(T)>

连接mysql时出现 MySqlConnector.MySqlException (0x80004005): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation 需要再数据库开启权限 grant SUPER,SYSTEM_VARIABLES_ADMIN on *.* to rootUser;flush pri…

Python数据框操作 -- 提取数据

创建一个数据框 import pandas as pd df pd.DataFrame({a:[2,2,3,4,5], b:[6,7,8,8,9]}) #创建一个数据框 提取某列 df.a # df的a这一列 df[a] # df的a这一列 df.iloc[:,0] # df的所有行&#xff0c;第0列&#xff08;依然是a列&#xff09; 提取某几列 df[[a,b]] #…

未见过类型题每周总结(个人向)

1.DP40 小红取数 题目 解析 一道01背包的衍生问题&#xff0c;我们可以按照它的思路定义数组dp[i][j],表示前i个数中%k为j的最大和。为什么设置未%k的最大和呢&#xff1f;是因为当两个数分别%k&#xff0c;如a%kx&#xff0c;b%ky。那么&#xff08;ab&#xff09;%k&#…

C++基础与深度解析 | 类进阶 | 运算符重载 | 类的继承 | 虚函数

文章目录 一、运算符重载二、类的继承1.类的继承2.虚函数 一、运算符重载 在C中&#xff0c;operator关键字用于重载运算符&#xff0c;使得类的实例可以使用内置的操作符&#xff08;如、-、*、/等&#xff09;进行操作。 运算符重载的特性&#xff1a; 重载不能发明新的运算…

通信协议:常见的芯片间通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。首先说明&#xff0c;芯片间通信方式根据通信时钟的区别可以分为&#xff1a;异步…

上位机图像处理和嵌入式模块部署(f407 mcu中的网络开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 和大家想的不太一样&#xff0c;只要mcu当中带有了mac ip&#xff0c;那么就意味着mcu本身支持了网络开发。但是如果需要mcu支持完整的tcp/ip&…

Java面试题:ArrayList底层实现原理、HashMap的实现原理、HashMap的jdk1.7和jdk1.8有什么区别

文章目录 一、List相关面试题1.1 ArrayList源码分析&#xff08;底层实现&#xff09;1.2 ArrayList底层的实现原理是什么1.3 ArrayList listnew ArrayList(10)中的list扩容几次1.4 如何实现数组和List之间的转换1.5 ArrayList 和 LinkedList 的区别是什么 二、HashMap相关面试…

如何在 Vue 组件中正确地使用 data 函数?

在 Vue 组件中正确使用 data 函数有以下几点需要注意: 返回一个对象: data 函数必须返回一个对象,这个对象包含了组件实例需要用到的所有数据属性。export default {data() {return {message: Hello, Vue!,count: 0}} }不要使用箭头函数: data 函数不应该使用箭头函数 () >…

《最游记》游戏全套源码(源码+引擎+文档+客户端+服务端+工具)

《最游记》首款西游降魔修仙网游—还原《西游记》小说经典&#xff0c;华丽场景&#xff0c;玄幻体验&#xff1b;七十二变&#xff0c;机甲配备&#xff1b;仙兵神器&#xff0c;灵兽助阵&#xff1b;降妖除魔&#xff0c;最游天下&#xff01;源码基于 vs 2005&#xff0c;可…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲&#xff0c;展示了新一代Rubin架构&#xff0c;这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时&#xff0c;黄仁勋提到了Blackwell Ultra GPU&#xff0c;并表示它可能会继续升级。然后他透露&#xff0c…

Qt 【Object::connect: No such slot 。。。】解决方法

发生如下所示问题&#xff0c;有三种原因造成&#xff1a; 1.下图中的Q_OBJECT被注释掉或者漏了&#xff08;该问题不常见&#xff09; 2.下图中声明slots漏了&#xff08;新手较常见&#xff09; 3.发生下面两行中的错误&#xff0c;在下面两行代码中仅仅是一个参数名字的区别…