我想构建一个简单的 Android 应用程序,例如 PushOver 应用程序 ,它具有 TCP 服务器并接收其记录的文本消息,然后将其作为推送通知发送。这部分已经完成并且工作正常。但即使 GUI 应用程序关闭,我也想接收消息。我知道这是可能的,因为 PushOver 应用程序做到了!我想,我可能需要一项服务......但我不知道如何制作一个服务,因为这是我的第一个 Android 应用程序。作为开发环境,我在 Kubuntu 机器上使用 BeeWare(Toga/Briefcase) 和 Python。我在手机上激活了USB调试,然后直接在Android上运行代码。
app.py
import toga
from toga.style import Pack
from toga.style.pack import COLUMN, ROW
import threading, socket
Debug = True
# ----- Color codes ----------------------
RED = '\033[31m'
GREEN = '\033[32m'
YELLOW = '\033[33m'
MAGENTA = '\033[35m'
CYAN = '\033[36m'
WHITE = '\033[37m'
EXCEPT = '\033[38;5;147m' # light purple
RESET = '\033[0m'
EventColor = ['', GREEN, YELLOW, RED]
class TCPServer(threading.Thread):
def __init__(self, app):
super().__init__()
self.daemon = True
self.app = app
self.terminated = threading.Event()
self.start()
def Terminate(self):
if self.is_alive():
self.terminated.set()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as ESocket:
try:
ESocket.settimeout(0.2)
ESocket.connect(('localhost', 12345))
except: pass
self.join()
def run(self):
def HandleClient(Conn):
with Conn:
message = Conn.recv(1024).decode()
if not message: return
self.app.loop.call_soon_threadsafe(self.app.LogMessage, message)
#self.app.SendNotif(message)
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as SSocket:
try:
SSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
SSocket.bind(('192.168.0.21', 12345))
SSocket.listen(10)
if Debug:
print(GREEN + 'TCP Server is listening on port 12345...' + RESET)
try:
while not self.terminated.is_set():
Conn, Addr = SSocket.accept()
if self.terminated.is_set():
Conn.close(); break
HandleClient(Conn)
except Exception as E1:
if Debug: print(RED + f'TCP Server exception (listen): {E1}' + RESET)
finally:
if Debug: print(YELLOW + 'TCP Server has stopped listening.' + RESET)
except Exception as E2:
if Debug: print(RED + f'TCP Server exception (setup): {E2}' + RESET)
class Application(toga.App):
def startup(self):
self.on_exit = self.exit_handler
self.main_window = toga.MainWindow(title=self.formal_name)
self.log = toga.MultilineTextInput(readonly=True, style=Pack(flex=1))
main_box = toga.Box(children=[self.log], style=Pack(direction=COLUMN, padding=10))
self.main_window.content = main_box
self.main_window.show()
self.tcp_server = TCPServer(self)
def exit_handler(self, app):
try:
self.tcp_server.Terminate()
finally:
return True
def LogMessage(self, message):
self.log.value += message + '\n'
def SendNotif(self, message):
self.main_window.info_dialog('New Message', message)
def main():
return Application()
不幸的是,BeeWare(Toga/Briefcase)不直接支持在 Python 中创建 Android 服务。BeeWare 专注于构建用户界面,而 Android 服务在后台运行,无需用户界面。
要实现即使在 Python 应用程序关闭后仍能接收消息的功能,需要探索 Android 服务和 Python 之间的桥梁。以下是一些选项:
1. 使用 Kivy 和 Pyjnius:
- Kivy 是一个 Python 框架,用于开发跨平台应用程序,包括 Android 应用程序。
- Pyjnius 是一个 Python 库,允许从 Python 代码中访问 Java 类。
使用 Kivy 和 Pyjnius,可以创建运行 Python 代码的 Android 服务。Pyjnius 可用于与 Android 的推送通知服务交互,并在收到新消息时向用户显示通知。
2. 使用 Flask 或 Django 创建 Web 服务器和 API:
- 使用 Flask 或 Django 等 Python 框架创建一个 Web 服务器和 API。
- 在的 Android 应用程序中,不要直接使用 TCP 套接字,而是向此 API 发送请求以获取新消息。
- 使用 Firebase Cloud Messaging (FCM) 或其他推送通知服务,以便即使应用程序关闭也可以向的应用程序发送通知。
3. 使用专用的推送通知服务:
- 像 Pusher、PubNub 或 Ably 这样的服务提供实时通信和推送通知功能。
- 这些服务通常提供 Python 库,方便将它们集成到的应用程序中。
请注意: 这些方法需要对 Android 开发、API 和潜在的其他服务的更深入了解。
以下是一些可以帮助入门的资源:
- Kivy 文档: https://kivy.org/doc/stable/
- Pyjnius 文档: https://pyjnius.readthedocs.io/en/latest/
- Flask 文档: https://flask.palletsprojects.com/en/2.0.x/
- Django 文档: https://docs.djangoproject.com/en/3.2/
- Firebase Cloud Messaging 文档: https://firebase.google.com/docs/cloud-messaging
请记住,需要学习 Android 开发基础知识以及如何与 Python 集成,才能在的应用程序中实现 Android 服务。
标签:python,android,service,beeware From: 78804934