Android服务:进程 vs. 非进程

18

将服务放在单独进程中和将其留在应用程序的主进程中有哪些实际区别?每种情况都可以用于什么?


5个回答

11

如果一个服务正在主进程中运行,那么在您的应用程序崩溃时会停止该服务。将服务放入自己的进程中对于某些可以从不同应用程序使用的服务或应该独立于主要应用程序运行的服务是有意义的。


7
我唯一认为将服务放在另一个进程中的原因是:
  1. 应用程序资源繁重,很可能会被操作系统快速杀死。将服务放在单独的进程中将分配资源,如果您的应用程序停止工作,您的服务将不会停止。
  2. 以防万一,如果您的应用程序出现错误并停止工作,您的服务将继续运行。
然而,如果您创建了一个良好的应用程序并使用了良好的编程,您不应该遇到这些问题。将服务放在单独的进程中会对SharedPreferences和并发数据库访问等事情造成麻烦...我建议不要这样做。
更不用说...另一个进程意味着另一个DVM。这将比在一个DVM中运行需要更多的资源,并减慢速度。

2
另将服务放入另一个进程中,会使静态变量的更改对主进程不可见。你可能会遇到这样的情况:当你给一个变量赋值时,它并没有被改变!我曾经因为这个问题浪费了一整天的时间!

true..你能解释一下这种行为吗? - Arnav M.
@William,你建议使用什么?将我的变量放在APPLICATION类中吗? - mhdjazmati
是的。将它们放在你理解生命周期的对象中。我通常使用Application类。 - William

1

以下是来自Android开发者网站的引用。

请注意,服务(像其他应用程序对象一样)在其托管进程的主线程中运行。这意味着,如果您的服务将执行任何CPU密集型操作(例如MP3播放)或阻塞操作(例如网络),则应在其自己的线程中生成该工作。

Jake指出,您可以通过清单控制它正在运行的名称。但根据文档,以下是发现:

关于Service类的大多数混淆实际上都围绕着它不是什么:

  • 服务不是一个独立的进程。服务对象本身并不意味着它在自己的进程中运行;除非另有规定,否则它将在与其所属的应用程序相同的进程中运行。

这很有趣,这里所说的是:

服务运行的进程名称。通常,应用程序的所有组件都在为应用程序创建的默认进程中运行。它与应用程序包具有相同的名称。元素的process属性可以为所有组件设置不同的默认值。但是,组件可以使用自己的process属性覆盖默认值,从而允许您将应用程序分布在多个进程中。
但无论如何,如果您需要将服务暴露给其他应用程序,例如,您需要向其他应用程序提供内容(如电话簿),则将服务设置为在不同的进程中运行是原因。

3
实际上,您对进程有非常具体的控制权。请参阅 http://developer.android.com/guide/topics/manifest/service-element.html [android:process标签]。 - Jake
哦,我从来没有注意到那里有这样的事情。 - xandy

-1
使用服务的进程属性被清单解析器拒绝,因此它相当具有误导性!

2
任何与之通信的广播接收器也必须在同一进程中,因此它们应该具有相同的名称,例如android:process="android.process.myservice"。 - warrell
这极大地加速了我的应用程序! - warrell

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