将服务绑定到Android中的活动

我试图编写一个简单的媒体播放器,使用RTSP播放streamaudio。 我有一个GUI活动和执行回放的服务。 我的问题是如何在活动和服务之间进行最好的沟通(例如,根据玩家状态更新gui)。

我知道我可以使用onBind()将服务绑定到活动,但是如果我理解正确,这将停止服务,如果活动被杀害。 即使用户退出活动,我也想继续播放。 有没有处理这个问题的标准或偏好的方法?

“如果你用startService(..)启动一个android服务,那么服务将一直运行,直到你明确地调用stopService(..) 。系统运行服务有两个原因:如果有人调用Context.startService()那么系统将检索服务(如果需要,创build它并调用它的onCreate()方法),然后用客户端提供的参数调用它的onStartCommand(Intent, int, int)方法。请注意,对Context.startService()多次调用不会嵌套(尽pipe它们会导致对onStartCommand() )进行多次相应的调用),所以无论启动了多less次,都会调用Context.stopService()stopSelf()一旦调用了Context.stopService()stopSelf()服务就会停止;但是,服务可以使用它们的stopSelf(int)方法来确保在启动的intents已经被处理之前服务不会停止。

客户端也可以使用Context.bindService()来获得到服务的持久连接。 如果它还没有运行(同时调用onCreate() ),同样会创build服务,但不会调用onStartCommand() 。 客户端将收到服务从其onBind(Intent)方法返回的IBinder对象,允许客户端将服务调用回该服务。 只要build立连接(无论客户是否保留对服务的IBinderIBinder ),服务就会继续运行。 通常, IBinder返回的是一个用AIDL写的复杂接口。

服务既可以启动,也可以绑定连接。 在这种情况下,只要服务启动,或者与Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行。 一旦这两种情况都不存在,Service的onDestroy()方法就会被调用,服务将被有效终止。 所有清理(停止线程,取消注册接收器)应该从onDestroy()返回完成。

首先,我们需要了解两件事

客户

  • 它向特定的服务器发出请求

     bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);` 

这里mServiceConnServiceConnection类的实例(内置的)它实际上是我们需要实现的两个接口(第一个为networking连接,第二个networking没有连接)监控networking连接状态。

服务器

  • 它处理客户端的请求,并对其自己的副本进行复制,只有发送请求的客户端是私有的,而服务器的副本在不同的线程上运行。

现在在客户端,如何访问服务器的所有方法?

  • 服务器用IBind Object.so发送响应IBind对象是我们的处理程序,它使用(。)运算符访问所有的服务方法。

     MyService myService; public ServiceConnection myConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { Log.d("ServiceConnection","connected"); myService = binder; } //binder comes from server to communicate with method's of public void onServiceDisconnected(ComponentName className) { Log.d("ServiceConnection","disconnected"); myService = null; } } 

现在如何调用服务的方法

 myservice.serviceMethod(); 

这里myService是对象, serviceMethodeserviceMethode中的方法。 通过这种方式在客户端和服务器之间build立通信。

我试图打电话

 startService(oIntent); bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE); 

因此,我可以创build一个粘性服务,并绑定到它。 绑定服务示例的详细教程。

有一个名为unbindService的方法,它将接受一个在调用bindService的时候创build的ServiceConnection。 这将允许您在离开服务的同时断开它的运行。

当您再次连接时,这可能会造成问题,因为当您再次启动活动时,您可能不知道它是否正在运行,因此您必须在活动代码中考虑该问题。

祝你好运!

这是一个有偏见的答案,但是我写了一个库,可以简化Android服务的使用,如果它们在应用程序的相同进程中本地运行: https : //github.com/germnix/acacia

基本上你定义了一个用@Service和它的实现类注解的接口,并且库创build和绑定了服务,处理连接和后台工作线程:

 @Service(ServiceImpl.class) public interface MyService { void doProcessing(Foo aComplexParam); } public class ServiceImpl implements MyService { // your implementation } MyService service = Acacia.createService(context, MyService.class); service.doProcessing(foo); <application android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> ... <service android:name="com.gmr.acacia.AcaciaService"/> ... </application> 

您可以获取关联的android.app.Service的实例来隐藏/显示持久性通知,使用您自己的android.app.Service并手动处理线程如果您愿意。

如果用户退出,则会调用onDestroy()方法。 此方法是停止应用程序中使用的任何服务。 所以如果你想继续服务,即使用户退出应用程序,只需擦除onDestroy() 。 希望这个帮助。