Уведомления в спящем режиме KIvy, Python
Уведомления приходят только при открытом приложении. Как правильно сделать работу в фоновом режиме?
service.py
from plyer import notification
from requests import get
from time import sleep
from jnius import autoclass
def get_data_by_id(department, id):
return get(f'http://code-factory.site/api/pop_up/{department}/{id}').text.split('&')[1]
PythonService = autoclass('org.kivy.android.PythonService')
PythonService.mService.setAutoRestartService(True)
department = ''
while True:
try:
with open('f.txt', 'r') as file:
department = file.readlines()[0].replace('\n', '')
except:
pass
if department != '':
for id in get(f'http://code-factory.site/api/notice/{department}').text.split(','):
if id != '':
name = get_data_by_id(department, id)
notification.notify(title=name, message=name, app_name='QR')
sleep(3)
main.py
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivy.clock import Clock
from requests import get, post
from plyer import notification
import requests
from kivy.utils import platform
Window.size = (1080, 2340)
Window.clearcolor = (0, 0.17, 0.55, 1)
end_mode = None
unit = None
try:
with open('f.txt', 'r') as f:
file = f.readlines()
department = file[0].replace('\n', '')
otk = file[1].replace('\n', '')
except:
department = None
otk = None
Builder.load_string(f"""
<MenuScreen>:
BoxLayout:
orientation: 'vertical'
padding: 5, 5
spacing: 5
Button:
text: 'ГЛАВНОЕ МЕНЮ'
background_color: (0, 0.12, 0.52, 1)
on_press: root.manager.current = 'select_department'
Button:
text: 'СКАНИРОВАНИЕ QR'
background_color: (0, 0.12, 0.52, 1)
on_press: root.manager.current = 'scan'
<SelectDepartmentScreen>:
BoxLayout:
orientation: 'vertical'
Button:
text: 'KM'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('km')
Button:
text: 'KMД'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('kmd')
Button:
text: 'ТМЦ'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('tmc')
Button:
text: 'ЗАГОТОВКА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('zagatovka')
Button:
text: 'СБОРКА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('sborka')
Button:
text: 'СВАРКА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('svarka')
Button:
text: 'УПАКОВКА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('upakovka')
<SelectOTKScreen>:
BoxLayout:
orientation: 'vertical'
Button:
text: 'Производство'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('not_otk')
Button:
text: 'ОТК'
background_color: (0, 0.12, 0.52, 1)
on_press: root.save('otk')
<EndScreen>:
BoxLayout:
orientation: 'vertical'
md_bg_color: 0, 0, 0, 1
Label:
text: '0'
id: unit
Button:
text: '+1'
background_color: (0, 0.12, 0.52, 1)
on_press: root.add(1)
Button:
text: '-1'
background_color: (0, 0.12, 0.52, 1)
on_press: root.add(-1)
Button:
text: 'Отправить'
background_color: (0, 0.12, 0.52, 1)
on_press: root.end()
<ScanScreen>:
BoxLayout:
#:import ZBarCam kivy_garden.zbarcam.ZBarCam
id: box
orientation: 'vertical'
padding: 1, 1
spacing: 1
ZBarCam:
id: qrcodecam
padding: 0, 2, 0, 0
size_hint: 1, 2
Label:
size: self.texture_size[0], 25
id: qr_text
text: ' '
size_hint: .0,.8
Button:
text: 'РАБОТА НАЧАТА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.server('start', True)
Button:
text: 'РАБОТА ПРИОСТАНОВЛЕНА -\\n ВОЗОБНОВЛЕНА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.server('stop', True)
Button:
text: 'ОБРАТНО В МЕНЮ'
background_color: (0, 0.12, 0.52, 1)
on_press: root.manager.current = 'menu'
Button:
text: 'ОТСКАНИРОВАТЬ'
background_color: (0, 0.12, 0.52, 1)
on_press: root.get_qr()
Button:
text: 'РАБОТА ЗАКОНЧЕНА'
background_color: (0, 0.12, 0.52, 1)
on_press: root.open_end('end')
Button:
id: back
text: 'ВОЗВРАЩЕНИЕ ЗАКАЗА НА ДОРАБОТКУ'
background_color: (0, 0.12, 0.52, 1)
on_press: root.open_end('back')
""")
class MenuScreen(Screen):
pass
class SelectDepartmentScreen(Screen):
def save(self, select):
global department
department = select
with open('f.txt', 'w') as file:
file.write(f'{department}\n')
App.get_running_app().root.current = 'select_otk'
class SelectOTKScreen(Screen):
def save(self, select):
global otk
otk = select
with open('f.txt', 'a') as file:
file.write(f'{otk}\n')
scan_screen = App.get_running_app().root.get_screen('scan')
if otk == 'otk':
scan_screen.ids['back'].opacity = 1
scan_screen.ids['back'].disabled = False
else:
scan_screen.ids['back'].opacity = 0
scan_screen.ids['back'].disabled = True
App.get_running_app().root.current = 'menu'
class EndScreen(Screen):
def add(self, digit):
global unit
self.ids['unit'].text = str(int(self.ids['unit'].text)+digit)
if int(self.ids['unit'].text) <= 0 or int(self.ids['unit'].text) > int(unit):
self.ids['unit'].text = str(int(self.ids['unit'].text)-digit)
def end(self):
global end_mode
r = get(f'http://code-factory.site/api/give_csrf')
csrf = r.text.split('=')[-1][1:-2]
cookies = r.cookies.get_dict()
if end_mode == 'end':
add = ''
if otk == 'otk':
add = '_otk'
post(f'http://code-factory.site/api/end{add}/{department}/{self.ids["unit"].text}',
data = {'id': App.get_running_app().root.get_screen('scan').ids['qr_text'].text.split('\n')[0], 'csrfmiddlewaretoken': csrf},
cookies = cookies)
else:
post(f'http://code-factory.site/api/back/{department}/{self.ids["unit"].text}',
data = {'id': App.get_running_app().root.get_screen('scan').ids['qr_text'].text.split('\n')[0], 'csrfmiddlewaretoken': csrf},
cookies = cookies)
App.get_running_app().root.current = 'scan'
App.get_running_app().root.get_screen('scan').ids['qr_text'].text = ''
class ScanScreen(Screen):
def server(self, command, check_otk):
r = get(f'http://code-factory.site/api/give_csrf')
csrf = r.text.split('=')[-1][1:-2]
cookies = r.cookies.get_dict()
add = ''
if check_otk and otk == 'otk':
add = '_otk'
post(f'http://code-factory.site/api/{command}{add}/{department}',
data = {'id': self.ids['qr_text'].text.split('\n')[0], 'csrfmiddlewaretoken': csrf},
cookies = cookies)
self.ids['qr_text'].text = ''
def open_end(self, mode):
global end_mode, unit
end_mode = mode
r = get(f'http://code-factory.site/api/give_csrf')
csrf = r.text.split('=')[-1][1:-2]
cookies = r.cookies.get_dict()
add = ''
if otk == 'otk':
add = '_otk'
unit = int(post(f'http://code-factory.site/api/get_unit{add}/{department}',
data = {'id': self.ids['qr_text'].text.split('\n')[0], 'csrfmiddlewaretoken': csrf},
cookies = cookies).text)
if department == 'km' or department == 'kmd':
r = get(f'http://code-factory.site/api/give_csrf')
csrf = r.text.split('=')[-1][1:-2]
cookies = r.cookies.get_dict()
add = ''
if otk == 'otk':
add = '_otk'
post(f'http://code-factory.site/api/end{add}/{department}/{unit}',
data = {'id': self.ids['qr_text'].text.split('\n')[0], 'csrfmiddlewaretoken': csrf},
cookies = cookies)
self.ids['qr_text'].text = ''
else:
App.get_running_app().root.current = 'end'
def get_qr(self):
qr = ''.join([symbol.data.decode('utf-8') for symbol in self.ids['qrcodecam'].symbols])
self.ids['qr_text'].text = qr
class MainApp(App):
def build(self):
sm = ScreenManager()
self.icon = 'bell-ring.png'
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(ScanScreen(name='scan'))
sm.add_widget(SelectDepartmentScreen(name='select_department'))
sm.add_widget(EndScreen(name='end'))
sm.add_widget(SelectOTKScreen(name='select_otk'))
if department == None or department == 'None' or otk == None or otk == 'None':
sm.current = 'select_department'
else:
sm.current = 'menu'
return sm
def on_start(self):
if platform == 'android':
from jnius import autoclass
service = autoclass('org.test.myapp.ServiceMyservice')
mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
service.start(mActivity, '')
if __name__=='__main__':
MainApp().run()
buildozer.spec
requirements = python3,kivy,kivymd,requests,zbarcam,urllib3,chardet,idna,opencv-python,pillow,kivy-garden.xcamera,pyzbar,python-android,plyer
services = Myservice:service.py
android.permissions = INTERNET, CAMERA, FOREGROUND_SERVICE