如何可能Service无限运行并且还允许在android中绑定?

时间:2011-09-03 10:20:46

标签: java android android-service

我想要一个可以在后台运行的服务,直到我停止,即使启动它的组件被销毁并且还允许绑定到活动。怎么可能?

根据android绑定服务文档 - 有三种创建绑定服务的方法

  1. 扩展活页夹类。
  2. 使用Messenger。
  3. 使用AIDL。
  4. 我使用messenger创建了绑定服务(第二种方法)。 Activity在其onStart()方法中绑定到服务,并在其onStop()方法中取消绑定。双向消息传递(在活动和服务之间)正常工作。但问题是,当活动取消绑定服务时,服务就会被破坏。但我想要一个可以无限期运行的服务。

    有可能作为android Services Dev Guide - “虽然本文档通常分别讨论这两种类型的服务,但您的服务可以双向工作 - 它可以启动(无限期运行)并且还允许绑定。它只是简单的是否实现了一些回调方法:onStartCommand()允许组件启动它,onBind()允许绑定。“

    我还在服务中实现onStartCommand()方法并返回START_STICKY,但从不调用它。查看dev指南中有界服务的生命周期回调,没有onStartCommand()回调方法。那么如何运行服务直到我们停止并允许绑定?

    我在fedora 15 OS中使用eclipse平台。

    任何帮助.....

6 个答案:

答案 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 ),并显示服务如何无限期运行,并允许与多项活动绑定

https://github.com/shanrais/BothService

答案 4 :(得分:1)

如果您在Android应用抽屉中添加"Ongoing Notification",则您的应用和服务不会被杀死。

查看http://developer.android.com/guide/topics/ui/notifiers/notifications.html

答案 5 :(得分:0)

您可以使用服务绑定器并在应用程序实例级别建立单个连接实例,在应用程序的onCreate中,这将使服务保持活动状态。该服务必须是前台服务