服务如何无限运行并允许在Android中绑定?

2022-09-01 05:13:51

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

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

  1. 扩展 Binder 类。
  2. 使用信使。
  3. 使用 AIDL。

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

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

我还在服务中实现 onStartCommand() 方法并返回START_STICKY,但它从未被调用。纵观开发指南中界定服务的生命周期回调,没有 onStartCommand() 回调方法。那么,在我们停止并允许绑定之前,如何运行服务呢?

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

任何帮助.....


答案 1

你只需要从某个地方开始。这将防止在没有其他绑定时自动停止它。startService()

服务文档中,强调我的:

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

正如其他人所指出的那样,如果需要资源,它仍然可能被Android杀死。您可以“优先”您的服务,并使其不太可能被杀死,如果您将其设置为前台服务


答案 2

我没有将服务与信使服务一起使用,但我已绑定到具有远程 (AIDL) 接口的远程服务。我的发现可能会有所帮助。由于我的主要活动和服务目前已经实现,因此我绑定到服务,就像您使用代码一样

mServiceConnected = bindService(new Intent("com.mypackage.MyService.SERVICE"), this,
                Context.BIND_AUTO_CREATE);

我的活动实现了服务连接

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

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

startService(new Intent("com.mypackage.MyService.SERVICE"));

则 unBind 不会导致服务的 onDestroy() 执行。仍有必要在活动的 onDestroy/Stop 中调用 unbindService,否则将泄漏服务连接。

在我的情况下,假设该服务仍然可供其他应用程序通过其远程接口绑定到。


推荐