创建一个在挂起状态下运行的安卓Python服务

15 投票
5 回答
6162 浏览
提问于 2025-04-15 18:05

这是我用 android-scripting 写的 Python 脚本:

import android, time

droid = android.Android()
interval = 1 # every 1 minute

while True:
    # define your own vibrate pattern here
    droid.vibrate(200)
    time.sleep(0.3)
    droid.vibrate(300)

    time.sleep(60*interval)

这个脚本的主要功能是每分钟震动一次(就像一个 提醒器)。不过,当手机锁屏且屏幕黑掉的时候,我感觉不到震动。可能是 Android 把这个脚本给暂停了(所以 while 循环也停了)?需要注意的是,我确实是把这个脚本作为服务在运行的(长按然后点击“作为服务启动”)。

有没有办法让这个脚本在任何时候都能工作,不管手机是否处于待机状态?

更新 1:我偶尔能听到震动声,但不是每分钟一次,而是大约每 5-10 分钟随机震动一次。

更新 2:如果我正常运行这个脚本(不是作为服务),也会出现这个问题。看起来“time.sleep”并没有按照指定的时间休眠。

5 个回答

1

在ASE中,这个方法可能行不通,因为它不支持AlertManager。你最好的办法是提交一个功能请求,然后耐心等待。如果你有兴趣的话,也可以自己扩展ASE,然后提交一个补丁!

2

我也遇到了类似的问题。

当你的安卓设备处于“锁定”模式时,time.sleep() 这个方法并不可靠:

以下是我在三星Galaxy S上使用SL4A release4、pythonForAndroid_r5和安卓2.3.3时尝试过的一些方法:

  • 把 time.sleep(interval) 放在 droid.wakeLockAcquirePartial() 和 droid.wakeLockRelease() 之间。这可以防止CPU变慢。
  • 使用 eventWaitFor(eventName, timeOutInMilliSeconds) 这个调用:

droid.eventWaitFor("ThisEventCannotHappen", interval*60000)

  • 经过几次测试,threading.Timer() 这个对象似乎也能按预期工作(需要确认...)

我不太确定,但你最好记住,这些方法在真正的“锁定/休眠”模式下可能会消耗比预期更多的电量,从而减少设备的使用时间。

更新:对于长时间的间隔,eventWaitFor() 也不可靠。下面是一个展示 Timer() 如何工作的代码片段:

import android
import threading
import logging


def doStuff():
    logging.info("testTimer.py: Stuff DONE")
    droid.notify('testTimer.py',"doStuff() has been called")
    droid.vibrate(500)

def createLog(path):
    logging.basicConfig(filename=path,
                        level=logging.INFO,
                        format='%(asctime)s %(message)s')

DELAY=600

droid=android.Android()
logpath="/mnt/sdcard/testTimer.py.log"
createLog(logpath)
timer=threading.Timer(DELAY,doStuff)
logging.info("timer starting now")
timer.start()
logging.info("doStuff() will be called by timer...Delay=%d" % DELAY)
10

脚本环境确实有点像二等公民。你想要的功能叫做AlarmManager,使用的是ELAPSED_REALTIME。如果在脚本环境中用不了这个功能,那你就没办法了。

目前来看,脚本环境并不是为了完全替代开发工具环境的。开发工具环境可以让你创建完整的应用程序,而脚本环境只是用来做一些简单的脚本任务,代价就是不能做更复杂的事情。抱歉。

撰写回答