我想要一个可以在后台运行的服务,直到我停止,即使启动它的组件被销毁并且还允许绑定到活动。怎么可能?
根据android绑定服务文档 - 有三种创建绑定服务的方法
我使用messenger创建了绑定服务(第二种方法)。 Activity在其onStart()方法中绑定到服务,并在其onStop()方法中取消绑定。双向消息传递(在活动和服务之间)正常工作。但问题是,当活动取消绑定服务时,服务就会被破坏。但我想要一个可以无限期运行的服务。
有可能作为android Services Dev Guide - “虽然本文档通常分别讨论这两种类型的服务,但您的服务可以双向工作 - 它可以启动(无限期运行)并且还允许绑定。它只是简单的是否实现了一些回调方法:onStartCommand()允许组件启动它,onBind()允许绑定。“
我还在服务中实现onStartCommand()方法并返回START_STICKY,但从不调用它。查看dev指南中有界服务的生命周期回调,没有onStartCommand()回调方法。那么如何运行服务直到我们停止并允许绑定?
我在fedora 15 OS中使用eclipse平台。
任何帮助.....
答案 0 :(得分:47)
您只需要在某个地方startService()
启动它。这将防止在没有更多绑定时自动停止它。
来自Service documentation,强调我的:
服务既可以启动,也可以绑定连接。在 在这种情况下,系统只要保持服务运行 要么启动,要么有一个或多个连接 Context.BIND_AUTO_CREATE标志。
正如其他人所指出的,如果需要资源,它仍可能被Android杀死。您可以“优先处理”您的服务,并使其成为foreground service时不太可能被杀死。
答案 1 :(得分:6)
我没有使用messenger服务的服务,但是我已经绑定了一个带有远程(AIDL)接口的远程服务。我的发现可能有所帮助。由于我的主要活动和服务目前已实现,我将像使用
这样的代码绑定服务mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
Context.BIND_AUTO_CREATE);
我的活动实现了ServiceConnection
当我在活动结束时调用 unbindService(this) 时,就像你找到的那样,调用服务的onDestroy()方法。
但是,如果在bindService行之前,我还使用
显式启动服务startService(new Intent("com.mypackage.MyService.SERVICE"));
然后unBind不会导致服务的onDestroy()执行。仍然需要在活动的onDestroy / Stop中调用unbindService,否则你将泄漏服务连接。
就我而言,可能该服务仍然可供其他应用程序通过其远程接口绑定。
答案 2 :(得分:3)
startService
方法启动服务时,才会调用 Service.onStartCommand
回调。由于@NickT和@JoelF已指出您需要在客户端代码中的startService()
调用之外调用bindService()
(例如在onCreate中)。
您可能还想查看这篇文章(有点旧,但仍然有用)文章:“Double life of a service”并尝试提供的示例程序作者。
答案 3 :(得分:2)
为了在服务和活动之间进行通信。您也可以使用官方Android示例中提到的Binder
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
正如官方的Android文档所暗示的那样 http://developer.android.com/guide/components/services.html#StartingAService
虽然本文档通常单独讨论这两种类型的服务,但您的服务可以双向工作 - 可以启动(无限期运行)并允许绑定。这只是一个问题,你是否实现了几个回调方法:onStartCommand()允许组件启动它和onBind()允许绑定。
此项目实施此服务混合( BothService ),并显示服务如何无限期运行,并允许与多项活动绑定
答案 4 :(得分:1)
如果您在Android应用抽屉中添加"Ongoing Notification"
,则您的应用和服务不会被杀死。
查看http://developer.android.com/guide/topics/ui/notifiers/notifications.html
答案 5 :(得分:0)
您可以使用服务绑定器并在应用程序实例级别建立单个连接实例,在应用程序的onCreate中,这将使服务保持活动状态。该服务必须是前台服务