当手机被锁定时,使用部分唤醒锁和服务不会使应用程序运行

时间:2015-10-12 19:02:15

标签: android pyjnius

我在我的kivy应用程序中使用部分唤醒锁和服务,以便在我锁定屏幕时它可以运行。当开关打开时,我的服务使手机每隔一秒振动,而应用程序仅在开关打开时才尝试获取部分唤醒锁。然而,这似乎不起作用,因为当我锁定手机时,手机会每隔一秒停止振动。这是我的main.py。

__version__ = "1.0"

import kivy
import plyer
kivy.require('1.0.9')

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.switch import Switch
from kivy.utils import platform
from kivy.clock import Clock
from kivy.properties import BooleanProperty
from kivy.lib import osc
from kivy.event import EventDispatcher
from jnius import autoclass

activityport = 3001
serviceport = 3000



class ActiveSwitch(Switch):
    pass


class VibrateButton(Button):
    def vibrate(self):
            plyer.vibrator.vibrate(3)

class Vibrate(Widget):
    activate = BooleanProperty(True)
    def on_activate(self, instance, value):
            osc.sendMsg('~/kivyinstall/sahil/reply/step3_active/service', [value, ], port=serviceport)


class ActiveApp(App):
    def build(self):
            if platform == 'android':
                    from android import AndroidService
                    service = AndroidService()
                    service.start()
                    self.service = service

            osc.init()
            oscid = osc.listen(ipAddr='127.0.0.1', port=activityport)
            osc.bind(oscid, self.message_callback, '~/kivyinstall/sahil/reply/step3_active')
            Clock.schedule_interval(lambda *x: osc.readQueue(oscid), 0)
            PythonActivity = autoclass('org.renpy.android.PythonActivity')
            activity = PythonActivity.mActivity
            Context = autoclass('android.content.Context')
            PowerManager = autoclass('android.os.PowerManager')
            power = activity.getSystemService(Context.POWER_SERVICE)
            global wakelock
            wakelock = power.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'TAG')

            return Vibrate()

    def message_callback(self, message, *args):
            global switch
            switch = message[2]
            self.function()

    def function(self):
            if switch == 0:
                    wakelock.acquire()
            if switch == 1:
                    wakelock.release()

    def on_pause(self):
            return True

    def on_resume(self):
            pass



if __name__ == '__main__':
         ActiveApp().run()

我尝试使用部分唤醒锁定,以便在手机锁定时让手机的CPU保持运行状态。我的猜测是手机在锁定时停止振动的原因是CPU在锁定时关闭,手机使用CPU振动。此外,当我解锁手机并重新打开应用程序时,开关仍处于与我离开时相同的位置,因为我将on_pause定义放在代码中,但手机不再振动。这让我相信,由于某种原因,代码没有获取部分唤醒锁定,并且当手机被锁定时CPU关闭。这个main.py和service / main.py能够成功地传递交换机的位置。但是当这个main.py收到消息时,wakelock.acquire()似乎没有让手机的CPU保持打开状态。

手机是否需要打开CPU才能在锁定时保持振动?如果是这样,那么在我锁定它之后还有另一种方法可以让CPU保持开启和手机振动吗?我正确使用jnius和wakelock.acquire / release吗?

如果手机在锁定时不需要CPU保持振动,那么还有什么导致手机在锁定时停止振动,以及在锁定手机后我需要保持什么振动?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您确定在buildozer.spec中设置了WAKE_LOCK权限:

# (list) Permissions
android.permissions = WAKE_LOCK