Python 如何在Android中保持kivy服务在后台运行(切换到其他应用程序或锁定屏幕时服务仍在运行)?
我正在尝试用kivy构建一个android应用程序,我的要求很简单: 当打开android应用程序时,它将从0开始计数,并且每5秒在状态栏中弹出一个提示。提示内容是当前计数值。如果应用程序切换到后台或屏幕被锁定,状态栏中仍会每隔5秒弹出提示 以下是我从Internet修改的代码: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
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