2010-11-03 78 views
17

将服务放入单独的流程或将其保留在应用程序的主流程中的实际区别是什么?每个场景将用于什么?Android服务:流程与非服务

+1

类似于[Android - 如何决定是否在单独的进程中运行服务?](http://stackoverflow.com/questions/4658511/android-how-to-decide-whether-to-run-a -service-in-a-separate-process) – 2012-08-14 05:49:05

回答

10

当一个服务在主进程中运行时,它会停止,以防你的应用程序因为任何原因崩溃。将服务放入其自己的过程对于某些服务来说是合理的,这些服务可以从不同的应用程序或服务中使用,这些服务应该独立于主应用程序运行。

1

以下为Android Developer's web site的报价。

请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果你的服务要做任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该产生自己的线程来完成这项工作。

杰克指出,你可以直通清单,控制名称正在运行的进程。但是从Documentatioin以下结果:

有关服务类最混乱实际上都是围绕着它不是什么:

  • 服务没有单独的进程。服务对象本身并不意味着它在自己的进程中运行;除非另有说明,否则它与其所属应用程序的运行过程相同。

这很有趣,说什么Here是:

的过程,其中服务是运行的名称。通常,应用程序的所有组件都在为应用程序创建的默认进程中运行。它与应用程序包具有相同的名称。元素的流程属性可以为所有组件设置不同的默认值。但是组件可以用自己的进程属性覆盖缺省值,从而允许将应用程序分布在多个进程中。

但无论如何,如果您需要将服务暴露给其他应用程序,例如,您需要向其他应用程序提供内容(如电话簿),将服务设置为在不同进程中运行是原因。

+3

其实你对流程有非常明确的控制。请参阅http://developer.android.com/guide/topics/manifest/service-element.html [android:过程标签] – Jake 2010-11-03 02:38:41

+0

哦。我从来没有注意到这样的事情。 – xandy 2010-11-03 02:41:23

-1

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

+1

Eureka ...此链接http://www.androidsoftwaredeveloper.com/2009/03/20/how-to-start-on-boot/显示进程名称必须以android.process开头,例如android:process =“android.process.myservice” – warrell 2010-12-02 10:26:37

+2

任何与它通信的广播接收器都必须在该过程中,所以它应该具有相同的名称,例如android:process =“android.process.myservice” – warrell 2010-12-02 10:28:00

+0

这大大加快了我的应用程序! – warrell 2010-12-02 10:28:47

7

我看到把一个服务在另一个进程的唯一原因是

  1. 该应用程序是资源重,有可能会被操作系统迅速杀死。把服务放在一个单独的过程中将分配资源,如果你的应用程序死了你的服务不会。
  2. 只是为了防止您的应用程序出现错误并死亡,您的服务将继续进行。

但是,如果您创建一个良好的应用程序并使用良好的编程,则不应该遇到这些问题之一。通过让你的服务在一个单独的进程中引起麻烦,像SharedPreferences和并发数据库访问......我建议不要这样做。

更不用说......另一个过程意味着另一个DVM。这需要比在一台DVM上运行更多的资源,并且会减慢速度。

2

同时将服务放在另一个进程中会使您对主进程隐藏静态变量的更改。你可以得到的情况,当你分配一个变量有一些价值,并没有改变!我花了一整天的时间来解决这个问题

+0

true ..你可以解释为什么这种行为 – 2015-05-18 06:03:18

+1

**不**使用静态变量的一个很好的理由:-) – William 2016-05-02 04:55:15

+0

@William你建议使用什么?把我的变量放在APPLICATION类中? – mhdjazmati 2017-03-08 13:11:42