【问题标题】:Android Service that kills old Service when new request comes in当新请求进来时杀死旧服务的Android服务
【发布时间】:2015-01-16 20:55:53
【问题描述】:

我需要为我的应用程序创建一个 android 服务,该服务需要在调用新的 startservice 方法时杀死同一类的先前服务。

我需要它来将数据从网络加载到我的应用程序。我定期轮询通知 API,并尝试使用不精确警报使用 AlarmManager 启动服务。我似乎无法摧毁它。我希望在启动新服务的情况下销毁以前的服务实例。

我尝试使用stopSelf()stopService() 结束服务,但似乎都不起作用。

【问题讨论】:

  • 我尝试使用 stopSelf() stopService() 结束服务,似乎不起作用。 @亚历克斯
  • 考虑到 Android 的 Service 类的架构,这是不可能且不可用的。但是,您可以使用服务的onStartCommand(...),每次您提供服务类作为startService(...) 方法的参数时都会调用它来启动新的互联网请求。但是您不能让同一服务的多个实例运行,因此,您不能让同一服务的多个实例进行交互
  • 目前尚不清楚为什么需要从互联网下载。您可以尝试使用 OkHttp 等第三方免费库从互联网获取数据。
  • "我只需要终止服务的当前实例并启动一个新实例" -- 重复你自己并不能解释 为什么 你认为你需要这个,所以我们可以帮助您找到更好的解决方案。
  • still 并没有解释为什么你认为正确的方法需要你“终止当前的服务实例并启动一个新的实例”。当然,您之前的评论中没有任何内容会“要求”这一点。现有服务实例完全能够下载新数据。

标签: java android android-activity service intentservice


【解决方案1】:

service 应该用于处理传入的意图、绑定到活动和执行后台工作。你永远不应该杀死它。实际上,您应该关注它可能由于内存不足事件等而被杀死的时间。

如果您认为您必须杀死它,那么您可能将“线程”与“服务”混淆了。一个线程可能需要停止,然后在产生一个新线程时终止,但不是服务。

无论您当前在 Service 中执行什么逻辑 - 尝试将其放入您可以管理的线程中,即“开始”“停止”“销毁”(尽管这些特定方法已被弃用)

然后使用Service 来管理该thread 类,基于它具有的意图和绑定。换句话说,当它接收到一个意图时,执行你需要的任何逻辑来杀死你的线程,然后再启动另一个。

如果您对原生线程不满意,也可以使用 AsyncTask

编辑:

正如 CommonsWare 所指出的,Service 应该能够带来价值。除非需要,否则不应运行。

【讨论】:

  • 一个明智的建议;我唯一要补充的是要记住 Thread 类的 stop()destroy() 方法已被弃用。相反,应该通过interrupt() 方法将中断请求发送到Thread
  • 是的 - 我把它们放在引号中,因为interrupt 是多种方式之一;我编辑了我的答案以帮助澄清。谢谢!
  • “你永远不应该杀死它”——现在,这在另一个极端中太过分了。服务应仅在主动向用户交付价值时运行。
  • @CommonsWare - 我同意。我强调了错误的词!感谢您指出这一点,我已经编辑了我的答案以反映。
  • “一般情况下,Android 会处理这个问题。一旦所有绑定器都被释放并处理了命令”——仅当您使用绑定模式或使用IntentService 时。在由startService() 启动的常规Service 中, 需要通过调用stopService() 或让服务本身调用stopSelf() 来停止它。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多