You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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()
    
  • 避坑提示
    1. 不要尝试用普通后台服务实现常驻,安卓9.0以后普通后台进程切后台1分钟左右就会被系统强制回收,前台服务的常驻通知是必要条件,不能隐藏
    2. 安卓13及以上版本需要在应用首次启动时动态申请通知权限,否则通知无法展示,前台服务会直接启动失败
    3. 如果你的后台逻辑完全不需要和UI交互,可以把代码单独写到service.py中,在buildozer.spec里配置android.services = BgService:service.py启动独立服务进程,就算UI进程被意外回收,后台脚本也能持续运行
    4. 后台逻辑不要做无意义的高频CPU占用、频繁唤醒设备的操作,否则会被系统判定为异常功耗应用强制查杀

内容的提问来源于stack exchange,提问作者Lakshmi Vallabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 00:01:25