将服务绑定到Android中的活动

时间:2009-12-16 17:28:11

标签: android service

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

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

5 个答案:

答案 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);`
    

这里mServiceConnServiceConnection类(内置)的实例它实际上是我们需要用两个(第一个用于网络连接和第二个网络未连接)方法来监视网络连接状态的接口。

服务器

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

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

  • 服务器使用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()即可。希望这有帮助。