使android Python服务在挂起状态下运行

时间:2010-01-16 06:08:12

标签: python android android-scripting

这是我使用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”在指定时间内没有睡觉。

5 个答案:

答案 0 :(得分:10)

脚本环境绝对是二等公民。你想要的是使用ELAPSED_REALTIME称为AlarmManager。如果脚本环境不可用,那么你就会陷入困境。

至少目前,脚本编写环境并不是开发工具包环境的完全替代品,您可以在其中创建完整的应用程序。这意味着允许您执行一些简单的脚本编写任务,但代价是无法执行更复杂的操作。遗憾。

答案 1 :(得分:2)

我面临同样的问题。

当您的Android设备处于“锁定”模式时,

time.sleep()不可靠:

以下是我在三星Galaxy S上尝试过SL4A release4 + pythonForAndroid_r5 + android 2.3.3的一些事情

  • 在droid.wakeLockAcquirePartial()和droid.wakeLockRelease()中包装一个time.sleep(interval)循环。 这样可以防止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)

答案 2 :(得分:1)

如果不支持AlertManager,这不太可能在ASE中运行。您最好的选择是提交功能请求并等待。或者,如果您有野心,请自行扩展ASE并提交补丁!

答案 3 :(得分:-1)

我对Python绑定知之甚少,所以我将回答一般的Android问题。请参阅Power Management

PARTIAL_WAKE_LOCK听起来很有意思:“唤醒锁定确保CPU正在运行。屏幕可能无法启动。”

  

探索唤醒锁示例

     

所有电源管理呼叫都遵循相同的规则   基本格式:

     
      
  1. 获取PowerManager的句柄   服务。
  2.   
  3. 创建一个唤醒锁和   指定电源管理标志   屏幕,超时等。
  4.   
  5. 获取唤醒锁。
  6.   
  7. 执行操作(播放MP3,   打开HTML页面等。)。
  8.   
  9. 释放唤醒锁定。下面的代码片段说明了这一点   这个过程。
  10.   
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应用程序,则不会遇到此问题。