首页 文章

将服务绑定到Android中的活动

提问于
浏览
82

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

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

6 回答

  • -4

    “如果启动一个带有 startService(..) 的Android服务,服务将保持运行,直到您明确调用 stopService(..) . 系统可以运行服务有两个原因 . 如果有人调用 Context.startService() ,那么系统将检索服务(创建它并调用它的 onCreate() 方法(如果需要)然后用客户端提供的参数调用它的 onStartCommand(Intent, int, int) 方法 . 此时服务将继续运行,直到 Context.stopService()stopSelf() 被调用 . 注意多次调用 Context.startService() 不会嵌套(尽管它们确实导致对 onStartCommand() 的多次相应调用,因此无论启动多少次,一旦调用 Context.stopService()stopSelf() ,服务将被停止;但是,服务可以使用它们的 stopSelf(int) 方法来确保在处理启动的意图之前不停止服务 .

    客户端还可以使用 Context.bindService() 获取与服务的持久连接 . 如果服务尚未运行(在执行此操作时调用_2616630),这同样会创建服务,但不会调用 onStartCommand() . 客户端将收到服务从其 onBind(Intent) 方法返回的 IBinder 对象,允许客户端然后回拨服务 . 只要 Build 连接,服务将保持运行(无论客户端是否保留对服务的引用 IBinder ) . 通常, IBinder 返回的是用AIDL编写的复杂接口 .

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

  • -1

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

    客户

    • 它向特定服务器发出请求
    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 是服务方法 . 通过这种方式,在客户端和服务器之间 Build 通信 .

  • 5

    我试着打电话

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

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

  • 21

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

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

    祝好运!

  • 146

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

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

    @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并根据需要手动处理线程 .

  • 9

    如果用户退出,将调用 onDestroy() 方法 . 此方法用于停止应用程序中使用的任何服务 . 因此,如果您想要继续服务,即使用户退出应用程序,也只需删除 onDestroy() . 希望这有帮助 .

相关问题