这是我使用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)
它基本上每分钟振动一次(如motivator)。但是,当手机被锁定并屏幕消失时,我感觉不到任何振动。也许Android正在冻结脚本(因此是while循环)?请注意,我确实将此脚本作为服务运行(长按并单击“作为服务启动”)。
有没有办法让这个脚本一直工作,无论电话暂停状态如何?
更新1 :我确实偶尔会听到振动,而不是每分钟都听到......而是每隔5-10分钟随机听一次。
更新2 :如果我正常运行脚本(不是作为服务),则会出现此问题。好像“time.sleep”在指定时间内没有睡觉。
答案 0 :(得分:10)
脚本环境绝对是二等公民。你想要的是使用ELAPSED_REALTIME称为AlarmManager。如果脚本环境不可用,那么你就会陷入困境。
至少目前,脚本编写环境并不是开发工具包环境的完全替代品,您可以在其中创建完整的应用程序。这意味着允许您执行一些简单的脚本编写任务,但代价是无法执行更复杂的操作。遗憾。
答案 1 :(得分:2)
我面临同样的问题。
当您的Android设备处于“锁定”模式时,time.sleep()不可靠:
以下是我在三星Galaxy S上尝试过SL4A release4 + pythonForAndroid_r5 + android 2.3.3的一些事情
droid.eventWaitFor(“ThisEventCannotHappen”,interval * 60000)
我不确定,但你最好记住,在真正的“锁定/休眠”模式下,这些技巧可能会消耗比预期更多的功率,从而减少设备的运行时间。
更新:对于长间隔,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)
答案 2 :(得分:1)
如果不支持AlertManager,这不太可能在ASE中运行。您最好的选择是提交功能请求并等待。或者,如果您有野心,请自行扩展ASE并提交补丁!
答案 3 :(得分:-1)
我对Python绑定知之甚少,所以我将回答一般的Android问题。请参阅Power Management。
PARTIAL_WAKE_LOCK
听起来很有意思:“唤醒锁定确保CPU正在运行。屏幕可能无法启动。”
探索唤醒锁示例
所有电源管理呼叫都遵循相同的规则 基本格式:
- 获取PowerManager的句柄 服务。
- 创建一个唤醒锁和 指定电源管理标志 屏幕,超时等。
- 获取唤醒锁。
- 执行操作(播放MP3, 打开HTML页面等。)。
- 释放唤醒锁定。下面的代码片段说明了这一点 这个过程。
醇>
PowerManager pm = (PowerManager)mContext.getSystemService(
Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK
| PowerManager.ON_AFTER_RELEASE,
TAG);
wl.acquire();
// ...
wl.release();
答案 4 :(得分:-2)
可能的解决方案:使用一些调度程序软件并定期启动脚本。这样你就不需要调用time.sleep()。
也许脚本编写不是这种周期性任务的最佳解决方案。如果您编写一个简单的Java应用程序,则不会遇到此问题。