Binder class 有什么作用? Android 绑定服务中的绑定是什么意思?

What does the Binder class do? What is the meaning of binding in Android bound services?

我对绑定服务一头雾水。我的问题是:

这些是关于绑定服务的问题。请详细说明。我已经阅读了文档,但我仍然不清楚。

绑定服务:

绑定服务是一种允许应用程序组件通过调用 bindService() 创建长期连接来绑定到它的服务。

当您希望通过进程间通信 (IPC) 与来自应用程序中的活动和其他组件的服务进行交互或将应用程序的某些功能公开给其他应用程序时,请创建绑定服务。

要创建绑定服务,请将 onBind() 回调方法实现到 return 定义与服务通信的接口的 IBinder。然后其他应用程序组件可以调用 bindService() 来检索接口并开始调用服务上的方法。服务只为绑定到它的应用程序组件服务,所以当没有组件绑定到服务时,系统会销毁它。您不需要像通过 onStartCommand() 启动服务时那样停止绑定服务。

IBinder:

要创建绑定服务,您必须定义指定客户端如何与服务通信的接口。服务和客户端之间的这个接口必须是 IBinder 的实现,并且是您的服务必须从 onBind() 回调方法 return 得到的。客户端收到IBinder后,就可以开始通过该接口与服务进行交互了。

onBind():

当另一个组件要与服务绑定时(例如执行RPC),系统通过调用bindService()来调用该方法。在此方法的实现中,您必须提供一个接口,客户端使用该接口通过 returning IBinder 与服务进行通信。您必须始终实施此方法;然而,如果你不想允许绑定,你应该 return null.

这是一个示例,可以作为上述答案的补充

  1. 在您的服务 class 中,使用我们内部 class 创建的对象初始化 IBinder 接口(检查步骤 2)
  2. 创建一个内部 class extends Binder 具有 getter 功能,以获得对服务 class[=50= 的访问权]
  3. 在您的服务中 class ovveride onBind 函数,并将其用于 return 我们在步骤 1 中创建的实例

**代码会帮你清除它**

public class MyServiceClass extends Service {

//binder given to client  
private final IBinder mBinder = new LocalBinder();

//our inner class 
public LocalBinder extends Binder {
public MyServiceClass getService() {
        return MyServiceClass.this;
    }
}
@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

public void doSomeWork(int time){ //we will call this function from outside, which is the whole idea of this **Binding**}

  }

下一步是绑定自身

在您的 MainClass 或任何您想绑定服务的地方,

  1. 定义服务绑定的回调,传递给 bindService()

    private ServiceConnection serviceConnection = new ServiceConnection(){

    @Override
    public void onServiceConnected(ComponentName className, IBinder service) {
       MyServiceClass.LocalBinder binder =(MyServiceClass.LocalBinder)service;
       timerService = binder.getService();
    }
    
    @Override
    public void onServiceDisconnected(ComponentName arg0) {
        //what to do if service diconnect
    }
    

    };

  2. 绑定时刻

    Intent intent = new Intent(this, MyServiceClass.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    

解绑服务

unbindService(serviceConnection);
  1. 然后你使用[timerService = binder.getService();]调用我们之前在服务class中创建的public函数
    timerService.doSomeWork(50);