2011-12-02 66 views
8

我有点困惑如何服务功能,特别是这两个东西:Android - 在Activity关闭后服务如何继续运行?

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

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

和:

注意:一种服务,它的宿主进程,该服务不会创建自己的线程的主线程中运行,在单独的进程不运行(除非另有说明) 。

我的问题:

  1. 这怎么可能,是由startService启动的服务()生存,如果主线程活动退出?或者只有那些服务才能在主要的Activity关闭中生存,这些都在单独的线程中?

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

+0

你能接受答案吗?谢谢 –

+0

@Kiran我会接受,如果我的第二个问题也回答。看看我的编辑猜测如何解决它。 – sydd

+0

通常你会产生线程来分配负载。但服务本身的目的是在不干扰活动的情况下执行一些繁重的操作。回答这个问题:“你可以在一个单独的线程上启动一个Activity吗?”。很可能,相同的答案也适用于服务 –

回答

6

报你,:

注意:一种服务,它的宿主进程,该服务不会创建自己的线程的主线程中运行,在单独的进程不运行(除非你另有指定)。

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

检查this

Android系统将试图保持过程,只要周围的服务已启动或已绑定了客户托管的服务。当在内存不足的运行,需要杀死现有流程,托管服务进程的优先级将资源所剩无几,只有当它需要终止进程躺在附近是高

所以,你的过程会被杀死。其他。该过程将继续保持您的服务。

+0

谢谢,这完全回答我的第一个问题。 – sydd

4
  1. 一个启动的服务可以存活启动它以完全相同的方式活动的关闭是一个活动可以在关闭另一个以startActivity()开头的活动时生存下来。活动和服务只是应用程序过程的两个独立组件。一旦开始,每个都独立存在。 (与绑定服务—有所不同,当没有任何绑定服务时,系统将关闭绑定服务)。

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

+0

和如果我在manifest.xml中为我的服务指定android:process =“:remote”会发生什么?它仍然在同一个线程? – sydd

+0

@sydd - 如果你指定一个类似的进程名称,它确实将运行在一个单独的线程中,因为它将在一个单独的进程中。但是,该服务仍然会在其他进程的事件线程中运行,因此您仍然需要编写相应的服务(将耗时的工作放到工作线程中)。 –

+0

@Todd你确定,它会在事件线程中运行吗?如果我用自己的'android:process'做了一个服务,并且在它的messenger的'handleMessage()'方法里放了一个'wait(5000)',它就不会阻塞UI线程。但是,如果我删除了'android:process'声明,那么wait命令会阻塞UI线程。 – sydd

相关问题