【问题标题】:What does the Binder class do? What is the meaning of binding in Android bound services?Binder 类有什么作用? Android绑定服务中的绑定是什么意思?
【发布时间】:2017-10-02 16:16:53
【问题描述】:

我完全对绑定服务感到困惑。我的问题是:

  • 绑定是什么意思?
  • Binder 类有什么作用?
  • “返回用于与服务交互的 IBinder”是什么意思?
  • 什么是 IBinder 对象?
  • onBind() 方法是如何工作的?

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

【问题讨论】:

    标签: android android-service android-binder


    【解决方案1】:

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

    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 = 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();] 的帮助调用我们之前在 Service 类中创建的公共函数
      timerService.doSomeWork(50);
      

    【讨论】:

      【解决方案2】:

      绑定服务:

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

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

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

      IBinder:

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

      onBind():

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

      【讨论】:

      • 一个实际的代码示例来配合这个 copy-pasta 也会很棒。
      猜你喜欢
      • 2018-09-14
      • 2019-02-12
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2010-11-07
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多