【问题标题】:Android - How is it possible, that a service keeps running after the Activity has been shut down?Android - 关闭 Activity 后服务如何继续运行?
【发布时间】:2014-02-20 22:08:46
【问题描述】:

我对服务的运作方式有些困惑,尤其是这两件事:

来自http://developer.android.com/guide/topics/fundamentals/services.html

当应用程序组件(例如活动)通过调用 startService() 启动服务时,服务被“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被破坏。

和:

注意:服务在其宿主进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。

我的问题:

  1. 如果主 Activity 线程退出,由 startService() 启动的服务如何存活?还是只有那些服务在主 Activity 关闭后仍然存在,它们位于单独的线程中?

  2. 如何在单独的线程中启动服务? http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingService 的开发文档仅显示了如何在创建服务时生成线程的示例...而不是如何在新线程中生成服务本身...
    编辑: manifest.xml 中的android:process= 是否用于在单独的线程中启动它? (如果它在一个新进程中启动它,那么它必须在一个单独的线程中..)

【问题讨论】:

  • 您能接受答案吗?谢谢
  • @Kiran 我会接受,如果我的第二个问题也得到了回答。请参阅我的编辑以猜测如何解决它。
  • 通常你会产生线程来分配负载。但是Service本身的目的是在不干扰Activity的情况下执行一些繁重的操作。回答这个问题:“你能在单独的线程上启动一个活动吗?”。很可能,同样的答案也适用于服务
  • Service是Android平台的宏组件。线程是虚拟机的一个微观元素。服务可以产生线程并在其上下文中控制它们。

标签: java android multithreading android-service


【解决方案1】:

引用你的话:

注意:服务在其宿主进程的主线程中运行——该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另外指定)。

当主要活动关闭时,并不一定意味着宿主进程退出。根据文档,服务继续运行是因为进程还活着!

查看this

只要服务已启动或绑定了客户端,Android 系统就会尝试保留托管服务的进程。当内存不足并需要终止现有进程时,托管服务的进程的优先级会更高

只有当资源不足并且需要杀死周围的进程时,您的进程才会被杀死。别的。该过程将继续存在,您的服务也会继续存在。

【讨论】:

  • 谢谢,这完美地回答了我的第一个问题。
【解决方案2】:
  1. 已启动的服务可以在启动它的活动关闭后继续存在,其方式与一个活动在另一个以startActivity() 启动它的活动关闭后的方式完全相同。活动和服务只是应用程序流程的两个独立组件。一旦开始,每个都独立存在。 (绑定服务有点不同——当绑定服务不再绑定时,系统将关闭它。)

  2. 您不能在单独的线程中启动服务,就像您不能在非事件线程中启动活动一样。您只能要求系统启动服务(通过startService()bindToService())。系统总是在事件线程上启动服务。

【讨论】:

  • 如果我在 manifest.xml 中为我的服务指定 android:process=":remote" 会发生什么?它还会在同一个线程上吗?
  • @sydd - 如果您指定这样的进程名称,它确实会在单独的线程中运行,因为它将在单独的进程中。但是,该服务仍将在该其他进程的事件线程中运行,因此您仍需要相应地编写该服务(将耗时的工作放入工作线程中)。
  • @Todd 你确定它会在事件线程中运行吗?如果我使用自己的android:process 提供服务,并将wait(5000) 放入其信使的handleMessage() 方法中,它不会阻塞UI 线程。但是如果我删除android:process 声明,等待命令会阻塞 UI 线程。
  • @sydd - 它在另一个进程的事件线程中运行。在wait 结束之前,该服务不会响应传入的请求。但你是对的,它不会阻塞另一个进程的 UI 线程。
  • 谢谢,现在我明白了。很遗憾,我不能选择 2 个正确答案:(
猜你喜欢
  • 1970-01-01
  • 2022-11-18
  • 2021-01-01
  • 2020-05-27
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2019-08-05
  • 2020-01-19
相关资源
最近更新 更多