Python移动端应用消息提醒开发实践

Hello,大家好,我是唐叔,今天想总结下:在实现「TodoList」应用移动端应用消息提醒的相关实践,欢迎查阅哦!

整个开发过程,我尝试过三种方案,下面是细致的方案内容:

第三方消息推送方案

第三方消息推送方案,简单说就是不依赖移动端应用本身实现消息提醒,而是依赖第三方服务端将消息推送到手机厂商的服务器,再由手机厂商推送消息给移动端应用。

集成思路

在第三方消息平台进行应用注册,然后移动端应用集成该平台封装好的 SDK,然后在第三方平台人工发消息,移动端即可接收消息。(当然,也可以使用自己的服务器集成平台发消息的 API 来实现自动化消息)。

方案思考

使用第三方消息推送的优势是基本不会出现消息无法接收;即使本地应用关闭了,也照样可以接收消息。

不过劣势也很明显,如果要实现自动化发送,那么需要自行搭建服务端

最开始「TodoList」应用是计划桌面端应用作为服务端来自动化推送消息给移动端。为啥最终没这样干呢?

主要是存在维护成本,因为使用第三方服务要注册应用生成应用唯一标识 AppKey

而像「TodoList」是完全开源的项目,等于 AppKey 也是暴露给使用者的,存在被滥用的风险;当然也可以采用实现相关代码,然后让用户自行配置 AppKey,不过感觉这样会复杂化用户操作,所以也最终没考虑了。

本地通知+AlarmManager

本地通知指的是不依赖第三方消息平台,直接由移动端应用本身的程序来触发消息提醒。这里 python 可以直接使用跨平台第三方依赖库 plyer

python 复制代码
from plyer import notification
title, message, priority = self._build_notification(notification_msg)
notification.notify(
    title=title,
    message=message,
    app_name="TodoList",
    # app_icon=utils.get_app_icon(),
    timeout=10,
)

不过,只使用本地通知,一旦应用关闭了,也就是程序关闭了,那么就无法触发了。

这里有几种方式解决该问题:

  • 前台服务:既然应用关闭就无法触发消息,那就让应用一直保活不关闭
  • AlarmManager:这种不需要 Python 进程一直运行,而是让安卓系统在指定时间唤醒你的 Python 脚本。

前台服务等于应用关不了,一直驻留,感觉很影响用户体验,也会很耗电,我估计没几个用户会希望一个待办应用 app 一直在手机上运行吧,所以选择的是本地通知 + AlarmManager

不过,这种方案最终也终止了,究其原因:实现起来太难辽。

如果是纯 Java 程序还好实现,毕竟安卓系统是支持直接运行 Java 的,问题是「TodoList」是基于 python......

补充:个人理解其实再继续倒腾,可能最终能成。毕竟 Buildozer 本身是支持打包 Java 程序以及自定义配置文件的,只是个人能力有限吧,没搞成而已......

系统日历提醒方式

系统日历提醒方式也是最终方式了。这种的话,貌似某些应用的打卡提醒就是用这种方式的。

实现起来相对也比较简单。使用 python 编写程序 Pyjnius 调用安卓日历接口,把待办事项存入系统日历,并设置系统提醒;同时完善相关权限申请提醒就可以了。

具体的实现代码稍微有点长,可以直接去看「TodoList」源码具体 MR 吧:feat(mobile): add calendar reminder for tasks.


好啦,以上就是今天的分享内容啦,感谢阅读。如果对「TodoList」应用感兴趣,也欢迎下载程序体验哦:Tags · TangIsLearning/TodoList,近期还有一个桌面小控件完成开发后,想着就推出 v1.0 版本,如果有其他你觉得实用的功能期望出现在「TodoList」应用上,欢迎留言提出哦。

相关推荐
codeaideaai2 小时前
使用UV创建python项目
python·fastapi·uv
A__tao2 小时前
告别手写 Go 结构体!推荐一个支持注释解析的 YAML 转 Struct 在线工具
开发语言·后端·golang
何以解忧,唯有..2 小时前
Go 语言语句分隔符详解:分号、换行与代码规范
开发语言·golang·代码规范
人邮异步社区2 小时前
C语言进阶的书籍推荐
c语言·开发语言
yongche_shi2 小时前
ragas官方文档中文版(十七)
python·ai·ragas·事实正确性
凡人叶枫2 小时前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客2 小时前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
凡人叶枫2 小时前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++
闵孚龙2 小时前
Tensor:PyTorch 世界里的一切都是张量
人工智能·pytorch·python
Sam09272 小时前
Java 转 AI Agent 开发:Java 和 Python 的区别与快速学习指南
java·人工智能·python·ai