Android IPC framework
A tiny Android IPC framework
based on Android Binder, ContentProvider.
repositories {
...
jcenter()
}
dependencies {
implementation 'com.reginald:andinvoker:xxx'
}
`
define AndInvokerProviders for each ipc process
public class ProcessAProvider extends AndInvokerProvider {}
public class ProcessBProvider extends AndInvokerProvider {}
....
`
register them in AndroidManifest.xml
<provider
android:name="ProcessAProvider"
android:authorities="${applicationId}.process.a"
android:exported="false"
android:process=":a" ></provider>
<provider
android:name="ProcessBProvider"
android:authorities="${applicationId}.process.b"
android:exported="false"
android:process=":b" ></provider>
....
`
// register a binder service with name in local/remote process
AndInvoker.registerService(context, “provider_authorities”, “binder_name”, new IServiceFetcher
@Override
public IBinder onFetchService(Context context) {
return new MyBinder();
}
});
* Register an Invoker
```java
public class MyInvoker implements IInvoker {
@Override
public Bundle onInvoke(Context context, String methodName, Bundle params, ICall callback) {
// handle invoke here ...
// callback here if needed
if (callback != null) {
Bundle data = new Bundle();
// ...
callback.onCall(data);
}
// return result
return new Bundle();
}
}
// register invoker in local/remote process
AndInvoker.registerInvoker(context, "provider_authorities", "invoker_name", MyInvoker.class);
@RemoteInterface
public interface IMyInterface {
String testBasicTypes(int i, long l, String s);
Bundle setCallback(@RemoteInterface IMyCallback callback);
}
// register interface in local/remote process
AndInvoker.registerInterface(context, "provider_authorities", "interface_name", new IMyInterfaceImpl(), IMyInterface.class);
`
register data codec for your custom data type(demo: GsonCodec)
AndInvoker.appendCodec(Class<S> yourCustomClass, Class<R> serializeClass, Codec<S, R> codec);
`
"provider_authorities", "binder_name");
IMyBinder myBinder = IMyBinder.Stub.asInterface(binderService);
* Invoke an IInvoker
```java
Bundle result = AndInvoker.invokeNoThrow(context, "provider_authorities", "invoker_name","method_name", params, callback)
try {
myInterface.testBasicTypes(1, 2L, “test”);
} catch(InvokeException e) {
// may throw InvokeException if remote service dies or other remote errors
}
````