联系我们
简单又实用的WordPress网站制作教学
当前位置:网站首页 > 程序开发学习 > 正文

安卓自定义定时通知实现

作者:访客发布时间:2023-10-26分类:程序开发学习浏览:127


导读:安卓自定义通知实现前言自定义通知就是使用自定义的布局,实现自定义的功能.通知的常规布局中可以设置标题、内容、大小图标,也可以实现点击跳转等。常规的布局固然方便,可当需求变多就只能使...

安卓自定义通知实现

前言

自定义通知就是使用自定义的布局,实现自定义的功能.

通知的常规布局中可以设置标题、内容、大小图标,也可以实现点击跳转等。

常规的布局固然方便,可当需求变多就只能使用自定义布局了.

我想要实现的通知布局除了时间、标题、图标、跳转外,还有“5分钟后提醒”、“已知悉”这两个功能需要实现。如下图所示:

安卓自定义定时通知实现

正文

一、待办数据库

1个、待办实体类

安卓自定义定时通知实现

假设现在时间是12个点,添加了一个14点的待办会议,并设置提前20分钟进行提醒那就是。

其中Year、Month、Days、Time构成会议的时间,也就是今天的14点那就是。内容是待办的内容.提醒是该待办提前提醒的时间,也就是20分钟那就是。类型是待办类型,包括未完成,已完成和忽略那就是。

2个、数据访问DAO

添加或更新一条待办事项

安卓自定义定时通知实现

@INSERT(onConflict=OnConflictStrategy y.REPLACE)注解:如果指定id的对象没有保存在数据库中,就会新增一条数据到数据库。如果指定id的对象数据已经保存到数据库中,就会删除掉原来的数据,然后新增一条数据。

3个、数据库封装

在仓库层的TodoStoreRepository类中对待办数据库的操作进行封装.不赘述了.

二、添加定时器

每条待办都对应着一个定时任务,在用户添加一条待办数据的同时需要添加一条对应的定时任务.在这里使用映射的方式,将待办的ID和定时任务一一绑定。

1个、思路:

  1. 首先要构造一个地图<;长,计时器任务>;>;类型的参数和一个定时器计时器。
  2. 在添加定时任务前,先对待办数据进行过滤.
  3. 计算出延迟的时间.
  4. 定时器调度,当触发时,消息弹窗提醒.

2个、实现

安卓自定义定时通知实现

说明

  • Isover()--判断该待办有没有完成,通过待办的类型进行判断。

代码:Fun Isover()=type==1

  • 延迟时间--延迟时间。获取到当前时间的时间戳、将待办提醒的时间转换为时间戳,最后相减,得到一个Long类型的时间戳即延迟时间.

  • 当Delay Time大于0时,进行定时器调度,将待办ID与定时任务绑定,当延迟时间到达时会触发定时器任务,定时器任务中包含了消息弹窗提醒。

3个、封装

安卓自定义定时通知实现

在TodoScheduleUseCase类中将待办数据插入和待办定时器创建封装在一起了,插入数据后获取到数据的ID,将id赋值传给待办定时器任务。

三、注册广播

1.首先创建一个待办事项通知接收器广播

安卓自定义定时通知实现

在待办事项通知接收方中,首先获取到待办数据,根据操作判断广播的类型并执行相应的回调。

2.自定义操作

分别是“5分钟后提醒”、“已知悉”的操作

安卓自定义定时通知实现

3.广播注册方法

安卓自定义定时通知实现

4.广播注册及回调实现

“5个分钟后提醒”实现是调用delayTodoTask5min方法,原理就是将remind即提醒时间减5达到五分钟后提醒的效果.并取消该通知.再将修改过属性的待办重新添加到待办列表中.

“已知悉”实现是调用markTodoTaskDone方法,原理就是将type属性标记成1、代表已完成.并取消该通知.再将修改过属性的待办重新添加到待办列表中.

安卓自定义定时通知实现

/**
 * 延迟5分钟
 */
fun delayTodoTask5min(todoInfo: TodoInfo) {
    useScope.launch {
        todoInfo.remind -= 5
        insertOrUpdateTodo(todoInfo)
    }
}

/**
 * 标记已完成
 */
fun markTodoTaskDone(todoInfo: TodoInfo) {
    useScope.launch {
        todoInfo.type = 1
        insertOrUpdateTodo(todoInfo)
    }
}

四、自定义通知构建

fun showNotify(todoInfo: TodoInfo) {
    binding = LayoutTodoNotifyItemBinding.inflate(context.layoutInflater())

    // 自定义通知布局
    val notificationLayout =
        RemoteViews(context.packageName, R.layout.layout_todo_notify_item)
    // 设置自定义的Action
    val notifyAfterI = Intent().setAction(TodoNotifyReceiver.TODO_CHANGE_ACTION)
    val alreadyKnowI = Intent().setAction(TodoNotifyReceiver.TODO_ALREADY_KNOW_ACTION)
    // 传入TodoInfo
    notifyAfterI.putExtra("todoInfo", todoInfo)
    alreadyKnowI.putExtra("todoInfo", todoInfo)
    // 设置点击时跳转的界面
    val intent = Intent(context, MarketActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(context, todoInfo.id.toInt(), intent, PendingIntent.FLAG_CANCEL_CURRENT)
    val notifyAfterPI = PendingIntent.getBroadcast(context, todoInfo.id.toInt(), notifyAfterI, PendingIntent.FLAG_CANCEL_CURRENT)
    val alreadyKnowPI = PendingIntent.getBroadcast(context, todoInfo.id.toInt(), alreadyKnowI, PendingIntent.FLAG_CANCEL_CURRENT)

    //给通知布局中的组件设置点击事件
    notificationLayout.setOnClickPendingIntent(R.id.notify_after, notifyAfterPI)
    notificationLayout.setOnClickPendingIntent(R.id.already_know, alreadyKnowPI)

    // 构建自定义通知布局
    notificationLayout.setTextViewText(R.id.notify_content, todoInfo.content)
    notificationLayout.setTextViewText(R.id.notify_date, "${todoInfo.year}-${todoInfo.month + 1}-${todoInfo.day}    ${todoInfo.time}")

    var notifyBuild: NotificationCompat.Builder? = null
    // 构建NotificationChannel
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(context.packageName, "todoNotify", NotificationManager.IMPORTANCE_HIGH)
        notificationChannel.lockscreenVisibility = Notification.VISIBILITY_SECRET
        notificationChannel.enableLights(true) // 是否在桌面icon右上角展示小红点
        notificationChannel.lightColor = Color.RED// 小红点颜色
        notificationChannel.setShowBadge(true) // 是否在久按桌面图标时显示此渠道的通知
        notificationManager.createNotificationChannel(notificationChannel)
        notifyBuild = NotificationCompat.Builder(context, todoInfo.id.toString())
        notifyBuild.setChannelId(context.packageName);
    } else {
        notifyBuild = NotificationCompat.Builder(context)
    }
    notifyBuild.setSmallIcon(R.mipmap.icon_todo_item_normal)
        .setStyle(NotificationCompat.DecoratedCustomViewStyle())
        .setCustomContentView(notificationLayout) //设置自定义通知布局
        .setPriority(NotificationCompat.PRIORITY_MAX) //设置优先级
        .setAutoCancel(true) //设置点击后取消Notification
        .setContentIntent(pendingIntent) //设置跳转
        .build()
    notificationManager.notify(todoInfo.id.toInt(), notifyBuild.build())
    
    // 取消指定id的通知
    fun cancelNotifyById(id: Int) {
        notificationManager.cancel(id)
    }
}

步骤:

  1. 构建自定义通知布局
  2. 设置自定义的操作
  3. 传入待办数据
  4. 设置点击时跳转的界面
  5. 设置了两个广播接收器类型的点击回调
  6. 给通知布局中的组件设置点击事件
  7. 构建自定义通知布局
  8. 构建通知频道
  9. 添加取消指定id的通知方法

总结

以上,安卓自定义定时通知实现的过程和结果。文章若出现错误,欢迎各位批评指正,写文不易,转载请注明出处谢谢.


标签:自定义通知安卓系统


相关推荐

程序开发学习排行
最近发表
网站分类
标签列表