0

有几种方法可以连接到 Service to Activity。我只对本地服务感兴趣,我LocalService会站在那里直到用户停止它(这也意味着应用程序的结束)。我可能知道错了,如果是,请纠正我。

参考页面上,说明为了直接使用本地服务的方法,我们应该使用ServiceConnection. 绑定后,我们可以有一个LocalService类的引用,我们可以使用this的方法LocalService。AFAIK 我们使用此参考调用的方法在具有相关活动的主线程上运行。

让我感到困惑的是,如果我使用骨架结构并LocalService直接通过其静态引用(即 by LocalService.getInstance())访问 's 方法会怎样。好吧,我已经使用它并且没有遇到任何问题,但我仍然不确定哪个更好,以及为什么。

提前致谢。如果需要,我可能会添加其他信息。

编辑:在我之前提到的解决方案中,没有活动保留对LocalService.

它用于

  1. 开始一些LongRunningAsyncTasks(在服务停止之前全部停止和引用无效),
  2. 更新应用程序Notification
  3. 得到getFilesDir()
  4. 保留枚举值(其引用未保存在其他地方,它仅用于比较)以便从任何地方访问(不值得使用 SharedPreferences)。
  5. 举杯祝酒
4

2 回答 2

1

注意活动和服务的静态引用,因为它们可能是内存泄漏的原因。如果您不希望您的服务在主进程中运行,则将其提取到另一个进程中并使用服务连接。

如果您不需要服务的任何反馈,那么就不要使用连接,而只需使用startService()将在服务方法中执行的几个命令onStartCommand()

如果您需要来自服务的反馈,但不频繁,则使用或通过 Handler 类使用startService()和来自服务的反馈。sendBroadcast()

如果您经常需要反馈(例如更新媒体播放器的滑块),那么最好使用服务连接。

请记住,您的服务可以在没有执行方法onDestroy()和任何通知的情况下随时终止,这就是为什么保持静态引用不是一个好主意。

于 2013-12-10T12:33:29.320 回答
1

从您所说的看来,您可能根本不需要服务。看起来您没有在 LocalService 中执行任何长期任务。如果是这种情况,您也可以使用 AsyncTask 或 Handlers 并完成。使用服务(本地或其他)的动机是在其中执行一些长期存在的任务,而不是停止主 UI 线程。如果您的任务不会占用太多时间,那么您不需要服务。

默认情况下,服务确实在主线程上运行。除非它是一个 IntentService,它会自动为您创建一个工作线程,并且所有任务都在这个工作线程中排队并一次处理一个。否则,您有责任为您的服务任务创建一个单独的线程。

所以,首先分析你是否真的需要一个服务。如果您的任务可以快速执行,那么甚至不必费心使用服务。

希望有帮助。

于 2013-12-10T13:17:50.357 回答