如何实现Android端Kivy应用后台运行Python脚本
Kivy+Buildozer安卓应用后台持续运行Python脚本实现方案
原生Kivy默认切到后台后会暂停主事件循环,单纯改配置没法绕过安卓系统的后台进程查杀机制,要实现main.py持续后台运行,必须搭配安卓前台服务实现,具体操作如下:
- 第一步:修改Buildozer配置
打开项目根目录的buildozer.spec文件,修改/新增以下配置项:# 关闭应用切后台自动暂停逻辑 android.pause = False # 配置CPU唤醒锁,避免设备休眠中断脚本执行 android.wakelock = True android.stop_locks_on_pause = False # 声明必要权限:唤醒锁、前台服务、通知发送(安卓13+必须) android.permissions = WAKE_LOCK, FOREGROUND_SERVICE, POST_NOTIFICATIONS # 安卓12+需指定前台服务类型,根据业务场景选:dataSync/location/mediaPlayback等 android.foreground_service_type = dataSync # 确保依赖包含pyjnius、android模块,用于调用安卓原生API requirements = python3, kivy, pyjnius, android - 第二步:集成前台服务逻辑
前台服务会在通知栏显示常驻提示,是安卓系统唯一认可的长时间后台运行模式,不会被系统随便查杀。在你的main.py启动逻辑前加入以下代码(仅安卓平台生效,桌面调试不会触发报错):from kivy.utils import platform if platform == 'android': from jnius import autoclass # 导入安卓原生类 PythonService = autoclass('org.kivy.android.PythonService') PythonActivity = autoclass('org.kivy.android.PythonActivity') Context = autoclass('android.content.Context') NotificationChannel = autoclass('android.app.NotificationChannel') NotificationManager = autoclass('android.app.NotificationManager') # 安卓8.0以上必须先创建通知渠道 CHANNEL_ID = "app_bg_service" CHANNEL_NAME = "后台运行服务" activity = PythonActivity.mActivity notify_manager = activity.getSystemService(Context.NOTIFICATION_SERVICE) channel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_LOW ) notify_manager.createNotificationChannel(channel) # 启动前台服务,绑定常驻通知 service = PythonService.mService notification = service.buildNotification( CHANNEL_ID, "应用后台运行中", "你的脚本正在持续执行" ) service.startForeground(1, notification) - 第三步:隔离后台运行逻辑
不要把持续执行的逻辑放在Kivy主UI线程里,单独开守护线程跑,避免阻塞UI导致应用崩溃:import threading import time def run_your_script(): while True: # 替换成你需要持续执行的业务逻辑 print("后台脚本运行中,时间戳:", time.time()) time.sleep(3) # 应用启动时拉起后台线程 bg_thread = threading.Thread(target=run_your_script, daemon=True) bg_thread.start() # 后续接你原有的Kivy App启动代码即可 # MyApp().run() - 避坑提示
- 不要尝试用普通后台服务实现常驻,安卓9.0以后普通后台进程切后台1分钟左右就会被系统强制回收,前台服务的常驻通知是必要条件,不能隐藏
- 安卓13及以上版本需要在应用首次启动时动态申请通知权限,否则通知无法展示,前台服务会直接启动失败
- 如果你的后台逻辑完全不需要和UI交互,可以把代码单独写到
service.py中,在buildozer.spec里配置android.services = BgService:service.py启动独立服务进程,就算UI进程被意外回收,后台脚本也能持续运行 - 后台逻辑不要做无意义的高频CPU占用、频繁唤醒设备的操作,否则会被系统判定为异常功耗应用强制查杀
内容的提问来源于stack exchange,提问作者Lakshmi Vallabh
相关产品推荐
相关产品推荐

