Я борюсь со связывателем из Android.
Я разработал приложение, которое должно загружать различные модули "драйвера" для некоторых устройств в качестве плагинов.В моем основном приложении я создаю дополнительный модуль (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 (реализация закорочена для публикации).
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, это не pssobile, чтобы привести android.os.BinderProxy к DriverBinder.Вот мой 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, потому что это происходит из другого процесса.Но я, как я могу взаимодействовать с этим сервисом и использовать свой функционал?Как я могу написать внешние плагины и использовать их в своем приложении?
Спасибо за помощь!
edit:
Я забыл код для сервиса, который возвращает связыватель.Вот мой 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);
}
}