如何让Android服务与活动进行通信

如何让Android服务与活动进行通信

我正在编写我的第一个Android应用程序,并试图在服务和活动之间进行沟通。我有一个服务,将运行在后台,并做一些GPS和基于时间的日志记录。我将有一个活动,将用于启动和停止服务。

因此,首先,我需要能够确定服务在活动启动时是否正在运行。这里还有一些其他的问题,所以我想我可以弄清楚(但请随时提供建议)。

我真正的问题是:如果活动正在运行,并且服务已经启动,我需要一种让服务向活动发送消息的方法。这一点上的简单字符串和整数-状态消息主要是。消息不会定期发生,所以我不认为轮询服务是一个很好的方式,如果有其他方式。我只希望在用户启动该活动时进行此通信-我不希望从服务中启动该活动。换句话说,如果您启动了该活动,并且服务正在运行,那么当发生一些有趣的事情时,您将在ActivityUI中看到一些状态消息。如果您不启动该活动,您将不会看到这些消息(它们没有那么有趣)。

似乎我应该能够确定服务是否正在运行,如果是的话,将活动添加为侦听器。然后,在活动暂停或停止时,以侦听器的身份删除该活动。这真的有可能吗?我能找到的唯一方法是让活动实现Parcelable并构建一个AIDL文件,这样我就可以通过服务的远程接口传递它。不过,这似乎有点过火了,我不知道该活动应该如何实现writeToPackcel()/readFromPackcel()。

有没有更简单或更好的方法?谢谢你的帮助。

编辑:

对于以后对此感兴趣的人,有来自Google的示例代码,用于通过示例目录/apis/app/RemoteService.java中的AIDL处理这个问题。


炎炎设计
浏览 880回答 3
3回答

暮色呼如

有三种明显的与服务通信的方式:使用意图使用AIDL使用服务对象本身(作为单例)在您的例子中,我选择了选项3。对它自己的服务进行静态引用,并在onCreate()中填充它:void onCreate(Intent i) {   sInstance = this;}使一个静态函数MyService getInstance(),它返回静态sInstance.然后进去Activity.onCreate()您可以异步地启动服务,直到服务实际启动(您可以让您的服务通过向活动发送意图通知您的应用程序它已经准备好了)。得到它的例子。当您拥有实例时,将您的服务侦听器对象注册到您的服务中,您将被设置。注意:当编辑活动中的视图时,应该在UI线程中修改视图,服务可能会运行自己的线程,因此需要调用Activity.runOnUiThread().最不需要做的事情是移除对侦听器对象的引用。Activity.onPause(),否则活动上下文的实例就会泄漏,而不是很好。注意:只有当应用程序/活动/任务是访问服务的唯一进程时,此方法才会有用。如果不是这种情况,您必须使用选项1或2。
打开App,查看更多内容
随时随地看视频慕课网APP