在developer docs for Bound Services中,给出了以下代码示例"扩展Binder类"在"创建绑定服务"。我们给出了以下代码段(我删除了不相关的位),其中Service
从IBinder
方法返回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;
答案 0 :(得分:3)
ServiceConnection.onServiceConnected()的定义是
public void onServiceConnected(ComponentName className, IBinder 服务)
请注意,参数为IBinder
- ServiceConnection
不知道服务返回的是哪种服务或IBinder
实现 - 只有您知道,因此为什么你需要将其转换为正确的类型。
答案 1 :(得分:2)
因为 onServiceConnected 中唯一的类型信息是您获得了IBinder
类型的对象。 IBinder
没有 getService 方法,因此您必须将IBinder
对象的强制转换为LocalBinder
类型的对象。然后,您可以调用 getService 方法。这就是静态类型的工作原理。