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

Posted

技术标签:

【中文标题】手机锁定时,使用部分唤醒锁和服务不会使应用程序运行【英文标题】:Using partial wakelock and service does not make app run when phone is locked 【发布时间】:2016-01-10 08:38:00 【问题描述】:

我在我的 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 后保持 CPU 开启和手机振动?我是否正确使用 jnius 和 wakelock.acquire/release?

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

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您是否确保在 buildozer.spec 中设置了 WAKE_LOCK 权限:

# (list) Permissions
android.permissions = WAKE_LOCK

【讨论】:

以上是关于手机锁定时,使用部分唤醒锁和服务不会使应用程序运行的主要内容,如果未能解决你的问题,请参考以下文章

ios中是不是有任何类型的部分唤醒锁定机制?

在没有互联网的情况下唤醒锁定的手机

与设备一起移动时,Android 不会退出打盹模式

Xamarin Forms iOS 在唤醒时冻结

使 iPad 屏幕关闭,但通过触摸唤醒(无锁定) - - iOS 6.0 / openFrameworks

远程推送通知不会唤醒我的手机