将服务绑定到Android中的活动

asp*_*ame 87 service android

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

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

Sch*_*jer 150

"如果你开始使用Android服务startService(..)该服务将继续运行,直到您显式调用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()."


Har*_*era 22

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

客户

这里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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

现在如何调用服务中的方法

myservice.serviceMethod();
Run Code Online (Sandbox Code Playgroud)

myService是对象,serviceMethode是服务方法.通过这种方式,在客户端和服务器之间建立通信.


M.H*_*fny 10

我试着打电话

startService(oIntent);
bindService(oIntent, mConnection, Context.BIND_AUTO_CREATE);
Run Code Online (Sandbox Code Playgroud)

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


vru*_*erg 5

有一个名为unbindService的方法,它将采用您在调用bindService时创建的ServiceConnection.这将允许您在保持运行的同时断开与服务的连接.

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

祝好运!