假设我有一个SDK,以Android Library (aar)的形式提供基本的媒体处理功能(它有自己的UI作为单个活动)。目前,任何客户端Android应用程序在调用我的SDK时,通过Bundle发送所需的数据。
现在,由于各种原因,在调用我的SDK后可能需要发送被发送数据的一些额外信息,因此我需要与调用方应用程序进行双向通信。
简而言之,在SDK内部,我需要能够检查客户端应用程序是否实现了某些接口,以便SDK可以使用它与客户端应用程序进行通信(客户端可能选择不提供实现,在这种情况下,SDK将回退到内部默认实现...)。
无论如何,我最初的做法是这样的:
在SDK中,我已经公开了数据提供程序接口:
一个本地绑定器接口,应该返回一个已实现接口的实例:
此外,在调用SDK时,客户端应用程序通过bundle选项传递ComponentName:
现在,由于各种原因,在调用我的SDK后可能需要发送被发送数据的一些额外信息,因此我需要与调用方应用程序进行双向通信。
简而言之,在SDK内部,我需要能够检查客户端应用程序是否实现了某些接口,以便SDK可以使用它与客户端应用程序进行通信(客户端可能选择不提供实现,在这种情况下,SDK将回退到内部默认实现...)。
无论如何,我最初的做法是这样的:
在SDK中,我已经公开了数据提供程序接口:
public interface ISDKDataProvider {
void getMeSomething(Params param, Callback callback);
SomeData getMeSomethingBlocking(Params param);
}
一个本地绑定器接口,应该返回一个已实现接口的实例:
public interface LocalBinder {
ISDKDataProvider getService();
}
然后,在客户端,使用SDK的应用程序必须提供一个执行任务并实现这些接口的服务:
public class SDKDataProviderService extends Service implements ISDKDataProvider {
private final IBinder mBinder = new MyBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void getMeSomething(Params param, Callback callback) {
// ... do something on another thread
// once done, invoke callback and return result to the SDK
}
@Override
public SomeData getMeSomethingBlocking(Params param);{
// do something..
// return SomeData
}
public class MyBinder extends Binder implements LocalBinder {
@Override
public ISDKDataProvider getService() {
return ISDKDataProvider.this;
}
}
}
此外,在调用SDK时,客户端应用程序通过bundle选项传递ComponentName:
sdkInvokationOptions.put("DATA_PROVIDER_EXTRAS", new ComponentName(getPackageName(), SDKDataProviderService.class.getName()));
从SDK中,我会检查服务是否存在以及是否可以绑定到它:
final ComponentName componentName = // get passed componentname "DATA_PROVIDER_EXTRAS"
if (componentName != null) {
final Intent serviceIntent = new Intent(componentName.getClassName());
serviceIntent.setComponent(componentName);
bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);
}
其中mConnection是:
private boolean mBound;
private ISDKDataProvider mService;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
final LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
}
};
这似乎可以正常工作,而且看起来很简洁,但我的问题是是否有更好的方法/实践来实现同样类型的通信?