Android单例中的服务和线程是等价的吗?

问题描述 投票:0回答:1

我的

WifiConnection
类封装了通过 Wi-Fi Direct(点对点)连接和接收数据的过程。它可以包含
thread {}
或用于套接字处理的
CoroutineScope(Dispatchers.IO)
。只要应用程序处于活动状态,连接就需要处于活动状态。用户可以打开其他应用程序(电话、即时消息等),但连接必须继续处于活动状态。

有什么区别:

  • 实现 Android
    Service
    并创建
    WifiConnection
  • 的实例
  • 或使用
    WifiConnection
    作为 Hilt 提供的单例

据我了解,这两种情况都会

WifiConnection
在用户与我的应用程序交互时活动/片段生命周期发生变化时生存。然而,当用户切换到其他应用程序或长时间关闭屏幕时会发生什么呢?我可以调用
startForeground()
方法并发送针对
Service
的持续通知。然而,如果单例是相同的结果,那么
Service
和通知就是开销。

android kotlin android-service
1个回答
0
投票

看来你在这里真正需要的是注入如何工作和Android生命周期的解释。

注入基本上是单例。某些组件(通常是应用程序)将保存一个 Dagger(Hilt 是在 Dagger 之上构建的)图,其中包含一堆已保存的实例,当您注入一个类时,它将应用这些已保存的实例。它比这更复杂,但这是一个广泛的概述。

这意味着实例将持续与应用程序对象本身一样长。只要程序在内存中,Application 对象就会持续存在。如果操作系统终止该进程,则应用程序对象将被销毁。重新启动应用程序会获得一个新的应用程序和 Dagger 图中所有内容的新实例。

在Android中,当应用程序处于后台时(堆栈顶部没有Activity),操作系统最终会杀死它以索取资源。所花费的时间可能会因省电模式、操作系统版本、手机利用率等而异。但当发生这种情况时,应用程序中的所有这些值都会被删除,因为该进程不再存在。

前台服务的作用是告诉操作系统这段代码将在后台运行。这使得它比没有前台服务的后台应用程序具有更高的优先级。它最终仍然会因为资源而被杀死,但在此之前它会被给予更多的时间。如果没有前台服务,如果您启动一个内存消耗大的应用程序,它可能会在几分钟甚至几秒钟内发生。对于其中一个,只有在很长一段时间后或者操作系统别无选择以允许其他前台应用程序继续运行时,才会发生这种情况。 (请注意,后台服务是不够的,在清理内存之前只允许在后台运行大约 2 分钟)。

因此,如果您需要在后台保留某个实例较长时间,请使用前台服务。请记住,这并不是万无一失的,您的前台服务不会永远持续下去。实际上,您应该考虑任何不需要在后台运行的选项,而是使用 BroadcastReceiver 响应传入事件,尽管对于 wifi direct 来说这可能很难做到。

© www.soinside.com 2019 - 2024. All rights reserved.