我正在尝试编写一个使用RTSP播放流式音频的简单媒体播放器。我有一个GUI活动和一个执行播放的服务。我的问题是如何在活动和服务之间进行最佳沟通(例如根据玩家状态更新gui)。
我知道我可以使用onBind()将服务绑定到活动,但如果我理解正确,如果活动被终止,这将停止服务。即使用户退出活动,我也想继续播放。是否有任何标准或首选的方法来处理这个问题?
答案 0 :(得分:147)
“如果您使用startService(..)
启动Android服务,则服务将保持运行,直到您明确调用stopService(..)
。
系统可以运行服务有两个原因。如果有人调用Context.startService()
,系统将检索服务(创建它并在需要时调用其onCreate()
方法),然后使用客户端提供的参数调用其onStartCommand(Intent, int, int)
方法。此时,该服务将继续运行,直到调用Context.stopService()
或stopSelf()
为止。请注意,对Context.startService()
的多次调用不会嵌套(尽管它们会导致对onStartCommand()
进行多次相应的调用),因此无论启动多少次,服务都会停止Context.stopService()
或stopSelf()
被召唤;但是,服务可以使用其stopSelf(int)
方法来确保在处理完启动意图之前不会停止服务。
客户端还可以使用Context.bindService()
来获取与服务的持久连接。如果服务尚未运行,这同样会创建服务(在执行此操作时调用onCreate()
),但不会调用onStartCommand()
。客户端将收到服务从其IBinder
方法返回的onBind(Intent)
对象,允许客户端再次回拨服务。只要建立连接,服务将保持运行(客户端是否保留对服务的IBinder
的引用)。通常返回的IBinder
用于已用AIDL编写的复杂接口。
服务既可以启动,也可以绑定连接。在这种情况下,只要系统启动或与Context.BIND_AUTO_CREATE
标志有一个或多个连接,系统就会保持服务运行。一旦这些情况都不成立,就会调用服务的onDestroy()
方法,并且服务会被有效终止。从onDestroy()
返回时,应完成所有清理(停止线程,取消注册接收器)。“
答案 1 :(得分:22)
首先,我们需要了解的两件事
它向特定服务器发出请求
bindService(new
Intent("com.android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);`
这里mServiceConn
是ServiceConnection
类(内置)的实例它实际上是我们需要用两个(第一个用于网络连接和第二个网络未连接)方法来监视网络连接状态的接口。
服务器使用IBind Object发送响应。所以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
是服务方法。
通过这种方式,在客户端和服务器之间建立通信。
答案 2 :(得分:10)
我试着打电话
startService(oIntent);
bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
因此,我可以创建一个粘性服务并绑定到它。 Bound Service Example的详细教程。
答案 3 :(得分:5)
有一个名为unbindService的方法将采用您在调用bindService时创建的ServiceConnection。这将允许您在保持运行的同时断开与服务的连接。
当您再次连接时可能会出现问题,因为当您再次启动活动时,您可能不知道它是否正在运行,因此您必须在活动代码中考虑这一点。
祝你好运!答案 4 :(得分:-4)
如果用户退出,将调用onDestroy()
方法。此方法用于停止应用程序中使用的任何服务。因此,即使用户退出应用程序,您仍希望继续服务,只需删除onDestroy()
即可。希望这有帮助。