Binder课程做什么? Binding是什么意思?在Android有界服务?

时间:2017-05-04 13:02:02

标签: android android-service bounded-types android-binder

我完全与Bounded Services混淆。我的问题是: - Binding是什么意思? Binder课程做什么?从服务返回iBinder对象是什么意思?什么是IBinder对象? onBind方法的工作原理是什么? 这些是关于有界服务的几个问题。 请详细解释我。我已经阅读过这些文件了。目前还不清楚。

2 个答案:

答案 0 :(得分:7)

绑定服务:

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

如果要从应用程序中的活动和其他组件与服务交互,或者通过进程间通信(IPC)将某些应用程序的功能公开给其他应用程序,请创建绑定服务。

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

<强>的IBinder:

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

<强> onBind():

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

答案 1 :(得分:0)

这是上述答案的示例

  1. 在您的服务类中,使用我们的内部类创建的对象初始化 IBinder 接口(请检查步骤2)
  2. 创建一个具有getter函数的内部类扩展 Binder ,以获得对服务类的访问权限
  3. 在服务类ovveride中的 onBind 函数中,并使用它返回我们在步骤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()

    私有ServiceConnection serviceConnection =新的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();]来调用我们之前在Service类中创建的公共函数。
    timerService.doSomeWork(50);