将服务绑定到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立连接(无论客户是否保留对服务的IBinder
的IBinder
),服务就会继续运行。 通常, IBinder
返回的是一个用AIDL写的复杂接口。
服务既可以启动,也可以绑定连接。 在这种情况下,只要服务启动,或者与Context.BIND_AUTO_CREATE
标志有一个或多个连接,系统就会保持服务运行。 一旦这两种情况都不存在,Service的onDestroy()
方法就会被调用,服务将被有效终止。 所有清理(停止线程,取消注册接收器)应该从onDestroy()
返回完成。
首先,我们需要了解两件事
客户
-
它向特定的服务器发出请求
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);`
这里mServiceConn
是ServiceConnection
类的实例(内置的)它实际上是我们需要实现的两个接口(第一个为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
是对象, serviceMethode
是serviceMethode
中的方法。 通过这种方式在客户端和服务器之间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()
。 希望这个帮助。