在应用程序类中绑定Android服务是个好主意吗?

在应用程序类中绑定Android服务是个好主意吗?,android,variables,static,android-service,foreground,Android,Variables,Static,Android Service,Foreground,我有一个Android前台服务,它包含一个会话地图(键,会话)。在我的活动中,我收到一个密钥,我希望从服务中获取会话。因此,我将我的每个活动绑定到服务,我可以要求服务使用我的密钥获取会话。但是这样做意味着我必须等待onServiceConnected()才能获得会话 在我的应用程序类中绑定一次服务并将我的服务放在一个静态变量中,然后我的所有活动都可以在它们的onCreate()中直接访问服务,而不是等待调用onServiceConnected()?但是,我的静态变量是否总是存在?你知道Andro

我有一个Android前台服务,它包含一个会话地图(键,会话)。在我的活动中,我收到一个密钥,我希望从服务中获取会话。因此,我将我的每个活动绑定到服务,我可以要求服务使用我的密钥获取会话。但是这样做意味着我必须等待
onServiceConnected()
才能获得会话


在我的应用程序类中绑定一次服务并将我的服务放在一个静态变量中,然后我的所有活动都可以在它们的
onCreate()
中直接访问服务,而不是等待调用
onServiceConnected()
?但是,我的静态变量是否总是存在?你知道Android是否可以在需要资源的情况下删除这个静态变量吗?我猜应用程序实例从未被删除,对吗?因此,将我的服务保存在一个静态变量中可能是一个好主意。你觉得怎么样?

你试图做的事情听起来像是React中某种调度器的肮脏实现,我一直想自己做,但因为时间不够,没有。请让我们知道你的结果

我建议使用一个消息,文档中有关于它的信息,所以不需要使用静态消息

是的,Android操作系统可以清除任何东西,它可以杀死服务,它可以使变量为空。大多数情况下,这种情况不会发生,因为这样做只是为了对前台应用程序进行优先级排序。因此,如果一个用户打开10个应用程序,而你的应用程序在后台,那么它可能会。这对我来说还可以。有时,我也会经历变量在片段中变为null,但随后我缩小了变量范围,并修复了它


此外,如果您正在考虑此问题,请尝试使用EventBus库或使用ReactJava,也许Realm ORM甚至Firebase可以帮助您。

应用程序本身没有其他Android组件那样的生命周期,因此如果您在其
onCreate()
回调期间调用
bindService()
,没有保证调用
unbindService()
,这可能会导致内存泄漏和不可预测的状态。其他人也指出了这一点

相反,您可以(显示类似“Remote Desktop Manager正在运行”的通知),这样可以使应用程序保持活动状态,并使
map
成为应用程序中的静态变量。通过这种方式,
活动
可以在没有连接延迟的情况下检索会话。不要忘记在所有会话关闭时调用
stopService(Intent-Intent)
stopSelf()
停止服务


顺便说一句,即使考虑到Android O的后台限制,它也应该可以工作。

您可以绑定到
应用程序中的
服务。
应用程序
实例基本上是一个单实例,只要托管应用程序的操作系统进程处于活动状态,它就会一直存在。在某个时刻,Android将关闭承载你的应用程序的操作系统进程,然后你的所有应用程序组件都将消失(
应用程序
实例、
服务
活动
实例等)。如果用户返回到你的应用程序,Android将创建一个新的操作系统进程,实例化一个新的
应用程序
实例,然后根据需要实例化你的应用程序组件。

我的应用程序允许你在远程桌面上打开会话并共享桌面。那些会话,我不能接受Android删除它们。这就是我的服务在前台运行的原因,因为我必须让会话保持活动状态。因此,我所有的开放会话都保留在服务中。但是,当我打开活动以显示特定会话的屏幕时,我必须获得会话。为此,我将活动绑定到服务上,然后请求会话。但我希望在打开活动时立即进行会话,而不是等待服务获取会话。这就是为什么我想保持它的静态我坚持认为通信必须使用Mesenger完成然后你必须使用持久性,为此我建议使用SharedReference,简单的键值数据你只需要上下文,这是因为服务可以将其用作服务中的上下文存储在SharedPreference中的会话活动请求Messenger此从SharedPreferenceAndroid获取它可以终止承载应用程序的操作系统进程,但随后将终止所有应用程序组件。一旦实例化了
应用程序
对象,它将永远不会被删除(垃圾收集)。它就像一个单例程序,Android摆脱它的唯一方法就是杀掉托管应用程序的操作系统进程。你说没有生命周期是什么意思?onCreate和onTerminateonTerminate实际上从未调用过,你不能依赖它。你也不能依赖onDestroy,但它仍然是活动生命周期的一部分。然而,我明白你的观点,我喜欢它的实用主义。那么问题是,如果我们不关心取消服务绑定,该怎么办?我们可以交替使用任何活动中的任何onStop向服务发送消息,然后执行我们需要的操作。我同意您的意见,我们也可以在最后一次结束活动时调用onStop,但我认为我们无论如何都需要这样做。关于“不在乎我们是否解除服务绑定”,我的想法是这样的,特别是如果我们在最后一分钟修复崩溃或其他问题。但他似乎是从头开始设计解决方案,并且设计出一些已经接受其缺陷为绝对真理的东西。这似乎不是一个开始的好方法。是的!这就是为什么我还建议考虑其他解决方案,如EventBus、ReactJava、Realm或Firebase。