首页 > 编程问答 >如何用Python制作Android服务?

如何用Python制作Android服务?

时间:2024-07-29 06:42:24浏览次数:17  
标签:python android service beeware

我想构建一个简单的 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

相关文章

  • Python Discord Bot 的应用程序命令的区域设置名称(多语言别名)
    如何根据用户的语言设置,使应用程序命令的名称具有不同的名称例如,如果一个用户将其discord的语言设置为英语,则用户可以看到英语的应用程序命令名称。另一方面,如果另一个用户将其不和谐语言设置为法语,则用户可以看到法语中的相同应用程序命令的名称。为此,我尝试使用ap......
  • 如何在Python中添加热键?
    我正在为游戏制作一个机器人,我想在按下热键时调用该函数。我已经尝试了一些解决方案,但效果不佳。这是我的代码:defstart():whileTrue:ifkeyboard.is_pressed('alt+s'):break...defmain():whileTrue:ifkeyboard.is_pr......
  • 在Python中解压文件
    我通读了zipfile文档,但不明白如何解压缩文件,只了解如何压缩文件。如何将zip文件的所有内容解压缩到同一目录中?importzipfilewithzipfile.ZipFile('your_zip_file.zip','r')aszip_ref:zip_ref.extractall('target_directory')将......
  • 如何在Python中从RSA公钥中提取N和E?
    我有一个RSA公钥,看起来像-----BEGINPUBLICKEY-----MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAvm0WYXg6mJc5GOWJ+5jkhtbBOe0gyTlujRER++cvKOxbIdg8So3mV1eASEHxqSnp5lGa8R9Pyxz3iaZpBCBBvDB7Fbbe5koVTmt+K06o96ki1/4NbHGyRVL/x5fFiVuTVfmk+GZNakH5dXDq0fwvJyVmUtGYA......
  • Swagger、Docker、Python-Flask: : https://editor.swagger.io/ 生成服务器 python-fl
    在https://editor.swagger.io/上您可以粘贴一些json/yaml。我正在将此作为JSON进行测试(不要转换为YAML):{"swagger":"2.0","info":{"version":"1.0","title":"OurfirstgeneratedRES......
  • 使用 Matplotlib 的 Python 代码中出现意外的控制流
    Ubuntu22.04上的此Python3.12代码的行为符合预期,除非我按q或ESC键退出。代码如下:importnumpyasnp,matplotlib.pyplotaspltfrompathlibimportPathfromcollectionsimportnamedtuplefromskimage.ioimportimreadfrommatplotlib.widgets......
  • 参考 - Python 类型提示
    这是什么?这是与在Python中使用类型提示主题相关的问题和答案的集合。这个问题本身就是一个社区维基;欢迎大家参与维护。这是为什么?Python类型提示是一个不断增长的话题,因此许多(可能的)新问题已经被提出,其中许多甚至已经有了答案。该集合有助于查找现有内容。范......
  • 我的 Python 程序中解决 UVa 860 的运行时错误 - 熵文本分析器
    我正在尝试为UVa860编写一个解决方案,但是当我通过vJudge发送它时,它一直显示“运行时错误”。fromsysimportstdinimportmathdefmain():end_of_input=Falselambda_words=0dictionary={}text_entropy=0relative_entropy=0whilenotend_of_in......
  • Python进度条
    当我的脚本正在执行某些可能需要时间的任务时,如何使用进度条?例如,一个需要一些时间才能完成并在完成后返回True的函数。如何在函数执行期间显示进度条?请注意,我需要实时显示进度条,所以我不知道该怎么办。我需要thread为此吗?我不知道。现在在执行函数......
  • 此 Python 代码给出了超出时间限制的错误。由于其中使用的输入或输出方法而在其中传递
    N=int(input())L1=input()L=L1.split()s=set(L)d={}foreins:d[e]=L.count(e)print(d)max_value=max(d.values())print(max_value)L=list(d.values())print(L)res=L.count(max_value)print(res)/在提供正常输入时,它运行良好,但在提......