Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-在活动关闭后,服务如何可能继续运行?_Java_Android_Multithreading_Android Service - Fatal编程技术网

Java Android-在活动关闭后,服务如何可能继续运行?

Java Android-在活动关闭后,服务如何可能继续运行?,java,android,multithreading,android-service,Java,Android,Multithreading,Android Service,我对服务的功能有点困惑,尤其是以下两件事: 发件人: 当应用程序组件(如活动)通过调用startService()启动服务时,服务被“启动”。一旦启动,服务可以无限期地在后台运行,即使启动它的组件已被销毁 以及: 警告:服务在其宿主进程的主线程中运行。服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定) 我的问题是: 如果主活动线程退出,由startService()启动的服务怎么可能存活?或者只有那些在主活动关闭后仍然存在的服务,它们位于单独的线程中 如何在单独的线程中启动服务?

我对服务的功能有点困惑,尤其是以下两件事:

发件人:

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

以及:

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

我的问题是:

  • 如果主活动线程退出,由startService()启动的服务怎么可能存活?或者只有那些在主活动关闭后仍然存在的服务,它们位于单独的线程中

  • 如何在单独的线程中启动服务?位于的dev doc仅显示了创建服务时如何生成线程的示例…而不是如何在新线程中生成服务本身…
    编辑:manifest.xml中的android:process=是否用于在单独的线程中启动它?(如果它在新进程中启动,则它必须在单独的线程中..)

  • 一个已启动的服务可以在关闭一个启动它的活动后生存,正如一个活动可以在关闭另一个使用
    startActivity()启动它的活动后生存一样。活动和服务只是应用程序流程的两个独立组件。一旦启动,每一个都独立存在。(绑定服务的情况有点不同-当不再绑定任何绑定服务时,系统将关闭该绑定服务。)

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

  • 引用你的话:

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

    当主活动关闭时,并不一定意味着宿主进程退出。根据文档,服务将继续运行,因为进程处于活动状态

    检查

    只要服务已经启动或绑定了客户端,安卓系统就会尝试让托管服务的进程继续运行。当内存不足并且需要终止现有进程时,承载服务的进程的优先级将更高


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

    如果我在manifest.xml中为我的服务指定android:process=“:remote”,会发生什么?它仍将在同一个线程上?@sydd-如果您指定这样的进程名,它确实将在单独的线程中运行,因为它将在单独的进程中运行。但是,该服务仍将在另一个进程的事件线程中运行,因此您仍然需要相应地编写该服务(将耗时的工作放入工作线程中)。@Todd您确定它将在事件线程中运行吗?如果我使用自己的
    android:process
    创建一个服务,并在其messenger的
    handleMessage()
    方法中放置一个
    wait(5000)
    ,它将不会阻塞UI线程。但是,如果我删除
    android:process
    声明,wait命令将阻止UI线程。@sydd-它在另一个进程的事件线程中运行。在
    等待
    结束之前,服务不会响应传入的请求。但是你是对的,它不会阻止另一个进程的UI线程。谢谢,现在我明白了一切。很遗憾,我不能选择两个正确的答案:(谢谢,这完美地回答了我的第一个问题。你能接受这个答案吗?Thanks@Kiran如果我的第二个问题也得到了回答,我会接受。请参阅我的编辑,了解如何解决它。通常您会生成线程来分配负载。但服务本身的目的是在不干扰活动的情况下执行一些繁重的操作。回答这个问题:“你能在一个单独的线程上启动一个活动吗?”。很可能,同样的答案也适用于服务。服务是Android平台的一个宏组件。线程是虚拟机的一个微元素。服务可以生成线程并在其上下文中控制它们。