组件应该如何在多线程 Android 应用程序中交互?



我想制作一个简单的Android应用程序,必须在后台完成一些繁重的工作。我是Android开发的新手,需要有关如何正确设计此应用程序的建议。
因此,我的应用程序需要在后台运行一个接受客户端并与客户端持续通信的服务器,直到用户决定停止服务器。我有一个简单的活动,它有一个按钮,必须启动和停止服务器。我目前的想法是:

  • 按下按钮应该启动服务
  • 该服务必须启动一个单独的线程,该线程将完成服务器的所有工作。

我想我应该创建三个类:Activity类、Service类(要求系统运行前台Service,以便在用户关闭活动时进程不会被杀死(和可以ThreadAsyncTaskServer类。
问题是用户应该注意的服务器线程上可能会发生某些事件,因此这些事件必须触发 UI 中的一些更改,例如显示消息。我可以通过在onProgressUpdate()方法或runOnUiThread()中操作 UI 来通知用户,但这感觉不对劲。此外,我认为这违反了单一责任原则,因为服务器会完成预期之外的工作。也许我应该以某种方式通知Service,反过来,这将完成所有工作来通知用户?
此外,我需要能够以某种方式从 UI 控制服务器。因此,只是打电话给Service并忘记它不是一种选择。
所以,我的问题是如何对应用程序进行良好的设计?组件应如何相互交互?

首先,在大多数情况下,充当服务器的Android设备是一个糟糕的设计,因为蜂窝电话提供商目前为其客户端分配私有IP,而不是公共IP,因此您的监听端口将无法从Internet访问。 它只能在局域网内工作并通过WiFi连接。

您的服务器任务并不严格要求在服务中创建,它可以在应用程序的其他类中创建,但是如果您希望服务器线程在手机进入睡眠模式时不停止,则需要创建服务,因此为了避免这种情况,您需要创建一个前台服务(调用startForeground((的服务(并使用PowerManager.WakeLock。

为了与 UI 线程通信任务,我建议您使用消息,为了在 UI 线程中工作,您需要创建 Handler 派生类的实例并覆盖 handleMessage(( 方法。

从服务器线程中,您可以使用 sendMessage(( 将消息发送到句柄派生实例,您将在 UI 线程的 handleMessage(( 中接收它们。

如果您想与组件进行交互,例如在服务后台执行某些任务或从服务器获取通知,并且您想通知或更新UI或任何您想要的活动或前台片段中的任何内容,如消息等。然后您可以使用广播接收器

您需要在所需的活动或片段中使用特定操作名称注册接收器

然后通过 意图从服务类发送广播,其中包含具有特定操作名称的内容或数据

事件在广播接收器onReceive方法上触发操作和意图,您在活动或片段中声明,您可以通过从意图获取数据从此处更新UI

阅读安卓开发者官方文档中的广播概述

https://developer.android.com/guide/components/broadcasts 希望对您有所帮助

最新更新