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

Khu*_*hah 37 java android android-service

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

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

  1. 扩展Binder类.
  2. 使用Messenger.
  3. 使用AIDL.

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

它可以作为Android 服务开发指南 - "尽管本文档通常分别讨论这两种类型的服务,但您的服务可以双向工作 - 它可以启动(无限期运行)并允许绑定.这只是一个问题,你是否实现一些回调方法:onStartCommand()允许组件启动它,onBind()允许绑定."

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

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

任何帮助.....

Joe*_*l F 47

你只需要在startService()某个地方启动它.这将防止在没有更多绑定时自动停止它.

服务文档中,重点是我的:

服务既可以启动,也可以绑定连接.在这种情况下,只要系统启动或者使用Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行 .

正如其他人所指出的,如果需要资源,它仍可能被Android杀死.您可以"优先处理"您的服务,并使其成为前台服务时不太可能被杀死.

  • 这(至少)并非总是如此.我使用startService启动了服务,然后绑定到它.当最后一个绑定器释放绑定时,服务将被终止.该服务在一个单独的过程中运行. (2认同)

Nic*_*ckT 6

我没有使用messenger服务的服务,但是我已经绑定了一个带有远程(AIDL)接口的远程服务.我的发现可能有所帮助.由于我的主要活动和服务目前已实现,因此我像使用代码一样绑定到服务

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
                Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

我的活动实现了ServiceConnection

当我在活动结束时调用unbindService(this)时,就像你找到的那样,调用服务的onDestroy()方法.

但是,如果在bindService行之前,我还显式启动了服务

startService(new Intent("com.mypackage.MyService.SERVICE"));
Run Code Online (Sandbox Code Playgroud)

那么unBind不会导致服务的onDestroy()执行.仍然需要在活动的onDestroy/Stop中调用unbindService,否则会泄漏服务连接.

在我的情况下,大概该服务仍可供其他应用程序通过其远程接口绑定.