我在Android上与Binder斗争。
我开发了一个应用程序,该应用程序应为某些设备加载不同的“驱动程序”模块。在我的主应用程序中,我构建了一个额外的模块(driverinterface),其中包含“ DriverBinder”类和一个接口“ IDriver”。 IDriver接口包含与模块交互的所有功能。应用启动后,它将发现所有已安装的插件,用户可以选择应使用哪个插件。
这是我简单的DriverBinder
public class DriverBinder extends Binder {
public boolean getDriver(){ return true; }
}
而我的界面是经典的界面:
public interface IDriver {
public enum TriggerButtonMode {
NONE,
BARCODE,
RFID,
TRACE
}
public enum ReadRange {
AUTO, FAR, NEAR, PROXIMITY
}
//properties
String getManufacturer();
String getModelType();
String getDeviceDescription();
boolean isConnected();
boolean isReading();
}
现在,在另一个应用程序中,我编写了一个Tiny Device Driver,它实现了我的“ driverinterface”模块并使用了我的IDriver Interface(为发布而缩短了实现)。
public class TestDriver extends Binder implements IDriver {
@Override
public String getManufacturer() {
return null;
}
@Override
public String getModelType() {
return null;
}
@Override
public String getDeviceDescription() {
return null;
}
@Override
public boolean isConnected() {
return false;
}
@Override
public boolean isReading() {
return false;
}
}
所以一切都可以一起工作,在我的主应用程序中,我可以找到所有已安装的插件并可以访问它们。
现在,我连接到我的服务,并尝试强制转换为DriverBinder类,但是我得到了ClassCastException,它不是将android.os.BinderProxy强制转换为DriverBinder的pssobile。这是我的Connect:
private ServiceConnection mDriverConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "Driver connected!");
try {
DriverBinder connDriver = (DriverBinder) service;
boolean isConn = connDriver.getDriver();
String s = "";
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "Driver disconnected...");
}
};
我发现多数民众赞成在一个BinderProxy,因为它来自不同的过程。但是我如何与这些服务交互并使用我的功能?如何编写外部插件并在我的应用中使用它们?
感谢帮助!
编辑:
我忘记了服务的代码,后者返回了活页夹。 Hiere是我的TestDriverService:
public class TestDriverService extends Service {
private final IBinder binder = new DriverBinder();
private final IDriver mDriver = new TestDriver();
@Nullable
@Override
public IBinder onBind(Intent intent) {
String status = String.valueOf(((DriverBinder)binder).getDriver());
Log.i("TestDriverService", "Service started! whoop whoop! Binder Val: " + status);
return binder;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("TestDriverService", "OnStartCommand called!");
return super.onStartCommand(intent, flags, startId);
}
}