我正在考虑在我的应用程序中使用远程服务,但我在CommonsWare的this thread(以及其他线程)的答案中看到,似乎远程服务有许多缺点/担忧,如浪费的CPU,内存和电池生活。这让我犹豫不决。所以我想首先由专家来实现我的想法:
问题#1:鉴于我的应用程序的应用程序(如下),您认为使用远程服务是个坏主意吗?或者,这是正确的方法吗?
我的应用程序有两个部分,一台在PC上运行的Wi-Fi客户端,一台在Android上运行的Wi-Fi服务器。它们通过Socket来回传输位于SD存储卡中的应用程序数据文件。 Android应用程序有超过48,000行代码,相当大的我会说。启动时,它会自动启动服务。然后,该服务创建一个单独的线程,调用ServerSocket.accept()
来监听该线路。即使Android应用程序未运行,用户也可以按PC上的按钮启动文件传输。
我理解服务的生命周期与活动无关;我不介意用户是否可以通过设置杀死应用程序和服务 - 他杀了它,他将不得不再次启动应用程序以启动服务器。他选择杀死它,他会自己开始。
但是如果Android系统在没有用户知情的情况下杀死了这个过程怎么办?在这种情况下,用户不知道Wi-Fi服务器已经死了,当他点击PC上的按钮时他会收到错误。因此,即使进程被系统杀死,我也希望服务器继续运行。因此,我认为远程服务就是答案。或者,是吗?
问题2:如何在应用和远程服务之间建立简单的单向通信?
两者之间唯一的沟通是应用程序需要知道服务的状态,比如它是否正在侦听Socket,或者它是否还在运行等等。如果死了,用户可以从应用程序的UI重新启动它。
我不想使用AIDL,这似乎是一种矫枉过正;全局变量不起作用,因为它们不在同一个进程空间中;甚至Application
单身人士似乎也不起作用。所以现在我正考虑使用共享首选项,或在内部存储中创建文件。我没有尝试过这些想法,但他们会工作吗?如果没有,还有更好的想法吗?
感谢您阅读本文!
答案 0 :(得分:3)
远程服务与普通服务类似。唯一的区别(我猜)它可以从其他应用程序和服务访问(它是一个导出的服务)。因此,如果您希望多个应用程序可以访问您的服务,那么您可以将其设置为远程服务。但在您的情况下,我认为您可以为您的应用程序提供服务。要使您的服务保持运行,您应该查看前台服务。它们是正常的服务,它们只是以命令startForeground
启动。这些服务android系统将尽可能地保持运行。
实际上,在你的情况下,它不是单向的。您询问您的服务有关州和服务应该询问。如果您选择的不是远程服务,那么在您的应用程序中,您只需调用服务方法(extending Binder class)即可。对于远程服务,我认为你可以使用两个信使或AIDL。