Python 如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍在运行)?

Python 如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍在运行)?,python,android,kivy,buildozer,Python,Android,Kivy,Buildozer,我正在尝试用kivy构建一个android应用程序,我的要求很简单: 当打开android应用程序时,它将从0开始计数,并且每5秒在状态栏中弹出一个提示。提示内容是当前计数值。如果应用程序切换到后台或屏幕被锁定,状态栏中仍会每隔5秒弹出提示 以下是我从Internet修改的代码: from os.path import join, dirname, realpath import kivy from kivy.app import App from kivy.uix.boxlayout imp

我正在尝试用kivy构建一个android应用程序,我的要求很简单:

当打开android应用程序时,它将从0开始计数,并且每5秒在状态栏中弹出一个提示。提示内容是当前计数值。如果应用程序切换到后台或屏幕被锁定,状态栏中仍会每隔5秒弹出提示

以下是我从Internet修改的代码:

from os.path import join, dirname, realpath

import kivy
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
from plyer import notification
from plyer.utils import platform
from kivy.properties import DictProperty
kivy.require('1.8.0')

a = 0
from kivy.utils import platform
if platform == 'android':
    #pass
    from jnius import autoclass
    package_name = 'net.saband.myapp'
    service_name = 'ENTRYPOINT_TO_PY'
    service = autoclass('{}.Service{}'.format(package_name, service_name))
    mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
    service.start(mActivity, '')

class NotificationDemo(BoxLayout):
    kwargs = DictProperty()
    def update(self,dt):
        global a
        a = a + 1
        mode = 'fancy'
        message = str(a)
        title = self.ids.notification_title.text
        self.ids.notification_text.text = message
        ticker = self.ids.ticker_text.text
        self.kwargs = {'title': title, 'message': message, 'ticker': ticker}
        if mode == 'fancy':
            self.kwargs['app_name'] = "Plyer Notification Example"
            if platform == "win":
                self.kwargs['app_icon'] = join(dirname(realpath(__file__)),
                                          'plyer-icon.ico')
                self.kwargs['timeout'] = 4
            else:
                self.kwargs['app_icon'] = join(dirname(realpath(__file__)),
                                          'plyer-icon.png')
        elif mode == 'toast':
            self.kwargs['toast'] = True
        print(message)
        notification.notify(**self.kwargs)


class NotificationDemoApp(App):
    def build(self):
        notify = NotificationDemo()
        Clock.schedule_interval(notify.update, 5)
        return notify

    def on_pause(self):
        return True

if __name__ == '__main__':
    NotificationDemoApp().run()
kv文件正常,见下表

#:kivy 1.8.0
<NotificationDemo>:
    orientation: 'vertical'
    Widget:
    BoxLayout:
        orientation: 'horizontal'
        size_hint: 1, None
        TextInput:
            id: notification_title
            text: 'Put title here'
            size_hint: 1, None
        TextInput:
            id: notification_text
            text: 'Put message here'
            size_hint: 1, None
        TextInput:
            id: ticker_text
            text: 'New notification'
            size_hint: 1, None
    Button:
        text: 'Toast Notification'
        size_hint: 1, None
        on_release: root.do_notify(mode='toast')
    Button:
        text: 'Simple Notification'
        size_hint: 1, None
        on_release: root.do_notify(mode='normal')
    Button:
        text: 'Fancy Notification'
        size_hint: 1, None
        on_release: root.do_notify(mode='fancy')
    Widget:
当我在android手机上安装apk时,它会在presplash show之后立即崩溃, 如果我像下面那样注释掉关于JNIU的行,apk可以正常运行,但服务不会在后台运行(状态栏中没有弹出提示)

我不知道我是否误解了JNIU,或者配置是错误的
再一次。。。任何帮助都将不胜感激

经过几天的测试,我解决了这个问题

我以前对后台操作的理解确实有问题, 或者我的解决方案只是实现目标的方法之一

main.py
中,定义服务并启动它:

from jnius import autoclass
SERVICE_NAME = u'{packagename}.Service{servicename}'.format(
    packagename=u'org.kivy.test',
    servicename=u'Myservice'
)
service = autoclass(SERVICE_NAME)
mActivity = autoclass(u'org.kivy.android.PythonActivity').mActivity
argument = ''
service.start(mActivity, argument)
buildozer.spec
中:

# (str) Package name
package.name = test

# (str) Package domain (needed for android/ios packaging)
package.domain = org.kivy

# (list) List of service to declare
services = Myservice:service.py
然后,根据需要编辑
service.py
main.py
service.py
可以使用进行通信

通过执行上述操作,打开应用程序后,即使应用程序切换到后台,也可以弹出通知。

这是代码吗

来自jnius导入自动类
服务=自动类(服务名称)
mActivity=autoclass(u'org.kivy.android.PythonActivity').mActivity
参数=“”
service.start(mActivity,参数)
在service.py或main.py中

if platform == 'android':
    #pass
    from jnius import autoclass
    package_name = 'net.saband.myapp'
    service_name = 'ENTRYPOINT_TO_PY'
    #service = autoclass('{}.Service{}'.format(package_name, service_name))
    #mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
    #service.start(mActivity, '')
from jnius import autoclass
SERVICE_NAME = u'{packagename}.Service{servicename}'.format(
    packagename=u'org.kivy.test',
    servicename=u'Myservice'
)
service = autoclass(SERVICE_NAME)
mActivity = autoclass(u'org.kivy.android.PythonActivity').mActivity
argument = ''
service.start(mActivity, argument)
# (str) Package name
package.name = test

# (str) Package domain (needed for android/ios packaging)
package.domain = org.kivy

# (list) List of service to declare
services = Myservice:service.py