当我不需要进程间通信时,Android服务是否有用?

当我不需要进程间通信时,Android服务是否有用?

问题描述:

看来,当我不需要进程间通信时,几乎没有理由使用服务。我知道的唯一原因是这样的:如果我的进程已经启动了Service,那么进程不太可能被杀死。当我不需要进程间通信时,Android服务是否有用?

我可以用dontWantToBeKilled()和canBeKilled()方法创建一个实用程序类,它可以启动/停止虚拟服务。除此之外,我不会使用服务。这是正确的吗?

尽管Service运行在与Activity相同的进程中,但没有什么能保证您的Activity不会被终止。

Processes and Threads

例如,这是上传图片到网站 应该启动一个服务进行上传,这样即使用户离开上传可以 继续在后台活动活动。使用 服务保证该操作至少具有“服务 进程”的优先级,而不管该活动发生了什么。这与 的原因相同,广播接收机应该使用服务而不是简单地在线程中放置耗时的操作而不是 。

结论: 如果你想这样做,这将需要一段时间,后台操作,它是重要的是正确地完成,使用Service

+0

我知道我的Activity可以被杀死,但“kill”只是使Android的引用无效,所以垃圾收集器可以将它从内存中删除。带有静态引用的对象(如单例)只有在整个进程被终止时才被删除。我认为对于长时间的后台操作,使用单例并调用启动/停止虚拟服务的dontWantToBeKilled()和canBeKilled()实用程序方法通常更简单。Android服务是一个有缺陷的设计或者一个非常糟糕的设计。 – fhucho

+0

@fhucho:你为什么要使用单例而不是'Service'? – Macarse

+1

有许多事情使得使用服务比使用单例更加复杂和困难。我不必做异步绑定,我不需要将数据序列化到startService,我不必了解不同的标志,startId等.Singleton更简单直接。 – fhucho

它不是必要的,如果一个进程启动服务然后,进程可能会被杀死。实际上进程保持活着或不会影响服务。作为其完全后台程序。可能是你已经开始一个进程的情况只是启动一项服务。所以流程和服务不能这样相互关联。

AFAIK我没有得到你最后的问题。

+0

我90%确定如果我的应用程序被杀死,那么我的服务也会被杀死。 – fhucho

+0

如果您来到应用程序之外,您的服务将不会被杀死。查看警报应用程序的警报服务并不取决于启动应用程序(无论是打开还是关闭) – Sameer

+0

“应用程序之外”是什么意思?闹钟应用程序使用广播,而不是服务。 – fhucho

是的,还有其他原因。

您的应用程序运行在一个进程中,只要系统需要更多资源,进程可以被系统杀死。

根据this,正在运行的服务比不在前台的活动具有更高的优先级,这意味着系统更有可能终止具有后台活动的应用程序进程,而不是具有服务的活动在后台运行。

对服务的文档指出:

If the service has been started, then its hosting process is considered to be less important than any processes that are currently visible to the user on-screen, but more important than any process not visible. Because only a few processes are generally visible to the user, this means that the service should not be killed except in extreme low memory conditions.

所以,你可以使用服务来减少你的应用程序被杀害的可能性。