Android绑定服务:为什么我们将这个IBinder实例转换为IBinder实例?

时间:2014-10-21 23:13:23

标签: android casting android-service android-service-binding android-binder

developer docs for Bound Services中,给出了以下代码示例"扩展Binder类"在"创建绑定服务"。我们给出了以下代码段(我删除了不相关的位),其中ServiceIBinder方法返回onBind()

public class LocalService extends Service {
    // Binder given to clients
    private final IBinder mBinder = new LocalBinder();
    ...
    /**
     * Class used for the client Binder.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with IPC.
     */
    public class LocalBinder extends Binder {
        LocalService getService() {
            // Return this instance of LocalService so clients can call public methods
            return LocalService.this;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder; //**********************************************************
    }
    ...
}

然后在我们的客户端中,我们在mBinder LocalBinder方法中收到onServiceConnected()对象(ServiceConnection的一个实例)。 我的问题是,为什么我们要尝试将LocalBinder作为argument传递给onServiceConnected()的实例转换为语句{{1}中的LocalBinder实例}

LocalBinder binder = (LocalBinder) service;

2 个答案:

答案 0 :(得分:3)

ServiceConnection.onServiceConnected()的定义是

  

public void onServiceConnected(ComponentName className, IBinder 服务)

请注意,参数为IBinder - ServiceConnection不知道服务返回的是哪种服务或IBinder实现 - 只有您知道,因此为什么你需要将其转换为正确的类型。

答案 1 :(得分:2)

因为 onServiceConnected 中唯一的类型信息是您获得了IBinder类型的对象。 IBinder没有 getService 方法,因此您必须将IBinder对象的强制转换为LocalBinder类型的对象。然后,您可以调用 getService 方法。这就是静态类型的工作原理。