将服务放在单独的流程中或将其保留在应用程序的主流程中有什么实际区别?每个方案将用于什么?
答案 0 :(得分:11)
当服务在主进程中运行时,如果您的应用程序因任何原因崩溃,它将被停止。将服务放入其自身的流程对于某些服务是合理的,这些服务可以从不同的应用程序或服务中使用,这些应用程序或服务应该独立于主应用程序运行。
答案 1 :(得分:7)
我看到将服务放入另一个流程的唯一原因是
但是,如果您创建一个好的应用程序并使用良好的编程,则不应遇到上述任何一个问题。通过将您的服务放在一个单独的进程中,它会导致SharedPreferences和并发数据库访问等问题...我建议不要这样做。
更不用说......另一个过程意味着另一个DVM。这将比在一个DVM中运行所需的资源更多,并且减慢了速度。
答案 2 :(得分:2)
同样将服务放在另一个进程中会使您对主进程的静态变量更改不可见。当您为某个变量赋值时,您可以获得情况,并且不会更改!我花了一整天时间来解决这个问题!
答案 3 :(得分:1)
以下是Android Developer's web site的引用。
请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要进行任何CPU密集型(例如MP3播放)或阻止(例如网络)操作,它应该生成自己的线程来执行该工作。
Jake指出,您可以通过清单控制正在运行的进程的 Name 。但是根据Documentatioin的发现:
关于Service类的大多数混淆实际上都围绕着它不是:
- 服务不是一个单独的过程。 Service对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它将在与其所属的应用程序相同的过程中运行。
这很有意思,Here所说的是:
运行服务的进程的名称。通常,应用程序的所有组件都在为应用程序创建的默认进程中运行。它与应用程序包具有相同的名称。元素的process属性可以为所有组件设置不同的默认值。但组件可以使用自己的流程属性覆盖默认值,允许您跨多个流程分布应用程序。
但无论如何,如果你需要将Service暴露给其他应用程序,例如,你需要向其他应用程序提供内容(如电话簿),设置服务以在不同的进程中运行是原因。
答案 4 :(得分:-1)
清单解析器拒绝使用服务的process属性,因此它具有误导性!