有几种方法可以连接到Service to Activity。我只对本地服务感兴趣,我的LocalService
会站在那里,直到用户停止它(这也意味着应用程序结束)。我可能知道错误,如果是,请纠正我。
在reference page上,声明为了直接使用本地服务方法,我们应该使用ServiceConnection
。绑定后,我们可以引用LocalService
类,我们可以直接使用此LocalService
的方法。 AFAIK我们使用此引用调用的方法在具有相关活动的主线程上运行。
让我感到困惑的是,如果我使用骨架结构并直接通过其静态引用(即LocalService
)访问LocalService.getInstance()
的方法,该怎么办?好吧,我已经用过它并且没有遇到任何问题,但我仍然不确定哪一个更好,为什么。
提前致谢。如果需要,我可以添加其他信息。
编辑:
在我之前提到的解决方案中,没有任何活动保留对LocalService
的引用。
用于
LongRunningAsyncTasks
(在服务停止之前全部暂停和引用无效),Notification
,getFilesDir()
,答案 0 :(得分:1)
了解活动和服务的静态引用,因为它们可能是内存泄漏的原因。如果您不希望您的服务在主进程中运行,则将其提取到另一个进程并使用服务连接。
如果您不需要服务的任何反馈,那么就不要使用连接,只需使用startService()
和几个将在服务的onStartCommand()
方法中执行的命令。
如果您需要服务方面的反馈,但不经常,请使用startService()
和来自sendBroadcast()
的服务或通过Handler类提供的反馈。
如果您经常需要反馈(例如更新媒体播放器的滑块),那么最好使用服务连接。
请记住,您可以随时杀死您的服务,而无需执行方法onDestroy()
且没有任何通知,这就是为什么保持静态引用不是一个好主意。
答案 1 :(得分:1)
根据您的说法,您可能根本不需要服务。看起来您没有在LocalService中执行任何长期任务。如果是这种情况,您也可以使用AsyncTask或Handler来完成。使用服务(本地或其他)的动机是在其中执行一些长期任务,而不是停止主UI线程。如果你的任务不会花费太多时间,那么你就不需要服务了。
默认情况下,服务确实在主线程上运行。除非它是一个IntentService,其中自动为您创建工作线程,并且所有任务在此工作线程中一次排队并处理一个。否则,您有责任为服务任务创建单独的线程。
所以,首先分析一下你是否真的需要服务。如果您的任务可以快速执行,那么请不要打扰服务。
希望有所帮助。