安卓 - 在 Activity 被关闭后,服务如何保持运行?

8

我有些困惑服务功能是如何实现的,尤其是这两个方面:

来自 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,如果我的第二个问题也得到回答,我会接受。请查看我的编辑,关于解决它的猜测。 - sydd
通常情况下,你会创建线程来分配负载。但是Service本身的目的是在不干扰Activity的情况下执行一些繁重的操作。回答这个问题:“你能在单独的线程上启动一个Activity吗?”很有可能,对于Service来说,也适用同样的答案。 - Kiran Kuppa
Service是Android平台的宏组件。而Thread是虚拟机的微元素。Service可以在其上下文中生成线程并控制它们。 - Kiran Kuppa
2个回答

6

引用您的话:

注意:服务在其所在进程的主线程中运行 - 服务不创建自己的线程,也不在单独的进程中运行(除非您另有规定)。

当主要活动被关闭时,并不一定意味着托管进程退出。根据文档,服务会继续运行,因为进程仍然存活!

请参阅此内容

Android 系统将尝试保持托管服务的进程的存在,只要服务已启动或客户端已绑定到它。当内存不足并需要结束现有进程时,托管服务的进程的优先级将更高

因此,只有当资源不足且需要结束未关闭的进程时,才会结束您的进程。否则,进程和服务都会继续运行。


谢谢,这完美地回答了我的第一个问题。 - sydd

4
  1. 一个启动的服务可以在启动它的活动关闭时生存下来,就像一个活动可以在另一个使用startActivity()启动它的活动关闭时生存下来一样。活动和服务只是应用程序进程的两个独立组件。一旦启动,每个组件都独立存在。 (对于绑定服务,情况有些不同-当没有任何东西绑定到该服务时,系统将关闭绑定的服务。)

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


如果我在manifest.xml中为我的服务指定android:process=":remote",会发生什么?它仍然会在同一个线程上吗? - sydd
@sydd - 如果您像那样指定进程名称,它确实会在单独的线程中运行,因为它将在单独的进程中运行。但是服务仍将在该其他进程的事件线程中运行,因此您仍然需要相应地编写服务(将耗时的工作放入工作线程中)。 - Ted Hopp
@Todd 你确定它会在事件线程中运行吗?如果我创建一个带有自己的android:process的服务,并在其信使的handleMessage()方法中放置一个wait(5000),它不会阻塞UI线程。但是,如果我删除android:process声明,则等待命令将阻塞UI线程。 - sydd
1
@sydd - 它在另一个进程的事件线程中运行。在wait结束之前,服务不会响应传入的请求。但是您正确地指出它不会阻塞另一个进程的UI线程。 - Ted Hopp
谢谢,现在我明白了一切。可惜我不能选择两个正确答案 :( - sydd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接