在onStartCommand()方法中开启一个通知,提高进程的优先级。注意:从Android 8.0(API级别26)开始,所有通知必须要分配一个渠道,对于每个渠道,可以单独设置视觉和听觉行为。然后用户可以在设置中修改这些设置,根据应用程序来决定哪些通知可以显示或者隐藏。

定义一个通知工具类,兼容8.0

class NotificationUtils(context: Context) : ContextWrapper(context) {

private var manager: NotificationManager? = null
private var id: String = context.packageName + "51"
private var name: String = context.packageName
private var context: Context = context
private var channel: NotificationChannel? = null

companion object {
@SuppressLint("StaticFieldLeak")
private var notificationUtils: NotificationUtils? = null

fun createNotification(context: Context, title: String, content: String, icon: Int, intent: Intent): Notification? {
if (notificationUtils == null) {
notificationUtils = NotificationUtils(context)
}
var notification: Notification? = null
notification = if (Build.VERSION.SDK_INT >= 26) {
notificationUtils?.createNotificationChannel()
notificationUtils?.getChannelNotification(title, content, icon, intent)?.build()
} else {
notificationUtils?.getNotification_25(title, content, icon, intent)?.build()
}
return notification
}
}

@RequiresApi(api = Build.VERSION_CODES.O)
fun createNotificationChannel() {
if (channel == null) {
channel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_MIN)
channel?.enableLights(false)
channel?.enableVibration(false)
channel?.vibrationPattern = longArrayOf(0)
channel?.setSound(null, null)
getManager().createNotificationChannel(channel)
}
}

private fun getManager(): NotificationManager {
if (manager == null) {
manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
}
return manager!!
}

@RequiresApi(api = Build.VERSION_CODES.O)
fun getChannelNotification(title: String, content: String, icon: Int, intent: Intent): Notification.Builder {
//PendingIntent.FLAG_UPDATE_CURRENT 这个类型才能传值
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
return Notification.Builder(context, id)
.setContentTitle(title)
.setContentText(content)
.setSmallIcon(icon)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
}

fun getNotification_25(title: String, content: String, icon: Int, intent: Intent): NotificationCompat.Builder {
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
return NotificationCompat.Builder(context, id)
.setContentTitle(title)
.setContentText(content)
.setSmallIcon(icon)
.setAutoCancel(true)
.setVibrate(longArrayOf(0))
.setSound(null)
.setLights(0, 0, 0)
.setContentIntent(pendingIntent)
}

最新文章

  1. Linux:JDK配置
  2. SqlParameter的感悟
  3. iOS项目中常用的第三方开源库
  4. fork函数
  5. MySQL索引建立与删除
  6. linux开关机命令
  7. 关于R文件丢失的一个问题
  8. cygwin下配置alias
  9. CSS3之Border-radius
  10. Unity4.3.4 安装出现 pattern not found
  11. linux查看文件的后几行
  12. Unity应用架构设计(10)——绕不开的协程和多线程(Part 1)
  13. unity3d 代码动态添加,修改BoxCollider2D
  14. Linux 下修改网卡MAC地址
  15. python添加到环境变量
  16. 使用 PowerShell 管理 Azure 磁盘
  17. Execution Plan 执行计划介绍
  18. HDU4791_Alice's Print Service
  19. day22<IO流+>
  20. SQL 数据库 学习 004 预备知识

热门文章

  1. vue组件父与子通信-登录窗口
  2. 利用Python进行windows系统上的图像识别与点击(Mac OS系统也可以)
  3. tbox新增stackless协程支持
  4. Java 13 发布了!
  5. JDK11 | 第三篇 : 局部变量类型推断
  6. Count Color poj2777 线段树
  7. HDU 1880 题解(字符串哈希)
  8. C# System.Web.Caching.Cache类 缓存 各种缓存依赖
  9. 第三讲JdbcRealm及Authentication Strategy
  10. Simple Vedio Intercom System