将IBinder从不同的过程服务投射到扩展的Binder

时间:2018-09-12 11:40:44

标签: android ipc android-binder

我在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);
    }
}

0 个答案:

没有答案