我对服务如何运作有点困惑,特别是这两件事:
来自http://developer.android.com/guide/topics/fundamentals/services.html:
当应用程序组件(例如活动)通过调用startService()启动它时,服务“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件被销毁。
和:
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。
我的问题:
如果主Activity线程退出,那么startService()启动的服务是如何生存的?或者只有那些服务在主Activity关闭时存活,这是在一个单独的线程中?
如何在单独的线程中启动服务? http://developer.android.com/guide/topics/fundamentals/services.html#ExtendingService的开发文档仅显示了在创建服务时如何生成线程的示例...而不是如何在新线程中生成服务本身...
编辑:manifest.xml中的android:process=
用于在单独的线程中启动吗? (如果它在一个新进程中启动它,那么它必须在一个单独的线程中。)
答案 0 :(得分:6)
引用你:
警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。
当主要活动关闭时,并不一定意味着托管进程退出。根据文档,该服务继续运行,因为该过程还活着!
检查this
只要服务已启动或客户端绑定服务,Android系统就会尝试保持托管服务的进程。当内存不足并且需要杀死现有进程时,托管服务的进程的优先级将更高
因此,只有当资源不足并且需要杀死周围的进程时,您的进程才会被终止。其他。这个过程依然存在,你的服务也会如此。
答案 1 :(得分:4)
启动的服务可以在启动它的活动关闭后继续存在,其方式与一个活动可以在使用startActivity()
启动它的另一个活动关闭后的生存方式完全相同。活动和服务只是申请流程的两个独立组成部分。一旦开始,每个都独立存在。 (绑定服务的情况有点不同 - 当系统不再绑定任何绑定服务时,系统将关闭绑定服务。)
您无法在单独的线程中启动服务,只能在非事件线程中启动活动。您只能要求系统启动该服务(通过startService()
或bindToService()
)。系统始终在事件线程上启动服务。