在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Andromeda开源软件地址:https://gitee.com/bettar/Andromeda开源软件介绍:AndromedaAndromeda provides communication among modules for both local and remote service. Anno:The reason that differentiate local service from remote service is that parameter types in remote service can only be primitive type or custom type that implements Parcelable, while parameter types in local service can be any type such as View and Context. Features
Anno: service here means interface and it's implementation instead of component Service. Comparsion between other communication solutions and Andromeda:
Downloadadd classpath in buildscript(replace $version with latest version name): classpath "org.qiyi.video.svg:plugin:$version" add core lib dependency in Application or library Module: implementation "org.qiyi.video.svg:core:$version" apply gradle plugin in application Module: apply plugin: 'org.qiyi.svg.plugin' How to useDispatcher configDispatcher should always in the process that live longest cause it manager all process infos!.Default process of Dispatcher is main process if not configed.Considering some process may live longer than main process in some apps(such as music app), developers shouldconfig process name for Dispatcher in this case. Just as follows in build.gradle of application module: dispatcher{ process ":downloader" } In this case, ":downloader" process is the one that live longest. initadd init code in Application.onCreate(): Andromeda.init(Context); Register and use local serviceDefinition and implementation of local serviceThere are only two differences between local service and normal interfaces:
Register local serviceThere are two methods to register local service, the first one is as follows: Andromeda.registerLocalService(ICheckApple.class.getCanonicalName(),new CheckApple()); Another is as follows: Andromeda.registerLocalService(ICheckApple.class,new CheckApple()); ICheckApple is interface definition. Considering proguard, registering local service with fixed String is not recommanded, just as follows: Andromeda.registerLocalService("wang.imallen.blog.moduleexportlib.apple.ICheckApple",CheckAppleImpl.getInstance()); How to use local serviceAny module that's in the same process with server module could obtain local service after registration. The first method is as follows: ICheckApple checkApple = (ICheckApple) Andromeda.getLocalService(ICheckApple.class); Another is as follows: ICheckApple checkApple = (ICheckApple) Andromeda.getLocalService(ICheckApple.class.getCanonicalName()); Similarly, considering proguard, obtaining local service with fixed String is not recommanded neighter: ICheckApple checkApple = (ICheckApple) Andromeda.getLocalService("wang.imallen.blog.moduleexportlib.apple.ICheckApple"); LocalServiceDemo shows the details of registration and use of local service。 Callback of local serviceCallback of local service is just as normal interface, which is all up to developers.As a result, Andromeda will not provide any callbacks. Registeration and use of remote serviceDefinition and use of remote serviceFirst, define a aidl interface, and expose it to common module along with its Stub and Proxy. package wang.imallen.blog.moduleexportlib.apple; import org.qiyi.video.svg.IPCCallback; interface IBuyApple { int buyAppleInShop(int userId); void buyAppleOnNet(int userId,IPCCallback callback); } Then provide implementation: public class BuyAppleImpl extends IBuyApple.Stub { private static BuyAppleImpl instance; public static BuyAppleImpl getInstance() { if (null == instance) { synchronized (BuyAppleImpl.class) { if (null == instance) { instance = new BuyAppleImpl(); } } } return instance; } private BuyAppleImpl() { } @Override public int buyAppleInShop(int userId) throws RemoteException { ... } @Override public void buyAppleOnNet(int userId, IPCCallback callback) throws RemoteException { ... }} Registration of remote serviceDifferen from registration of local service, IBinder of remote service is need for registration : Andromeda.registerRemoteService(IBuyApple.class, BuyAppleImpl.getInstance().asBinder()); The way as follows is also workable cause BuyAppleImpl extends IBuyApple.Stub, which extends android.os.Binder: Andromeda.registerRemoteService(IBuyApple.class, BuyAppleImpl.getInstance()); Another way to register is as follows: Andromeda.registerRemoteService(IBuyApple.class.getCanonicalName(),BuyAppleImpl.getInstance().asBinder()); Use of remote service
Set use in a FragmentActivity as example: IBinder binder = Andromeda.with(this).getRemoteService(IBuyApple.class); if (binder == null) { return; } IBuyApple buyApple = IBuyApple.Stub.asInterface(binder); if (buyApple == null) { return; } try { buyApple.buyAppleInShop(29); } catch (RemoteException ex) { ex.printStackTrace(); } Use of remote service in android.app.Fragment,android.support.v4.app.Fragment and normal Activity is similar, demos are CustomFragment,CustomSupportFragment and FragActivity,etc. Attention:Remote service could be used both in same process and other processes. When use in the same process, it will turned to local interface invoking. Callback of remote serviceConsidering time-consuming work may be done in server process, Callback of remote service is necessary.。For ones that need callback should add IPCCallback parameter in their aidl definitions: interface IBuyApple { int buyAppleInShop(int userId); void buyAppleOnNet(int userId,IPCCallback callback); } The canonical name of IPCCallback is org.qiyi.video.svg.IPCCallback. Its definition is as follows: interface IPCCallback { void onSuccess(in Bundle result); void onFail(String reason); } Client can use IPCCallback as follows: IBinder buyAppleBinder = Andromeda.getRemoteService(IBuyApple.class); if (null == buyAppleBinder) { return; } IBuyApple buyApple = IBuyApple.Stub.asInterface(buyAppleBinder); if (null != buyApple) { try { buyApple.buyAppleOnNet(10, new IPCCallback.Stub() { @Override public void onSuccess(Bundle result) throws RemoteException { ... } @Override public void onFail(String reason) throws RemoteException { ... } }); } catch (RemoteException ex) { ex.printStackTrace(); } } Considering the callback is in binder thread, while most developers want the callback in UI thread, Andromeda provide a BaseCallback for deverlopers. IBinder buyAppleBinder = Andromeda.getRemoteService(IBuyApple.class); if (null == buyAppleBinder) { return; } IBuyApple buyApple = IBuyApple.Stub.asInterface(buyAppleBinder); if (null != buyApple) { try { buyApple.buyAppleOnNet(10, new BaseCallback() { @Override public void onSucceed(Bundle result) { ... } @Override public void onFailed(String reason) { ... } }); } catch (RemoteException ex) { ex.printStackTrace(); } } Use BaseCallback instead of IPCCallback is recommanded! BananaActivity shows details of how to use it. Lifecycle controlTo enhence server process's priority, Andromeda will do bindService() when Andromeda.with().getRemoteService() in accordance with Fragment/Activity's lifecycle.As a result, unbind action is need when Fragment/Activity destroyed.There are 2 cases now:
public static void unbind(Class<?> serviceClass); public static void unbind(Set<Class<?>> serviceClasses); Subscribe and pushlish eventEventDefinition of Event in Andromeda is as follows: public class Event implements Parcelable { private String name; private Bundle data; ... } Obviously, Event consist of name and data, which is Bundle type that can load primitive type parameters or Parcelable type parameters. Subscribe eventSubscribing event is very simple with one who implements EventListenr such as MainActivity: Andromeda.subscribe(EventConstants.APPLE_EVENT,MainActivity.this); This means it subscribes Event whose name is EventConstans.APPLE_EVENT. Publish eventPublishing event is as simple as follows: Bundle bundle = new Bundle(); bundle.putString("Result", "gave u five apples!"); Andromeda.publish(new Event(EventConstants.APPLE_EVENT, bundle)); After published, all listeners in any processes could receive the event. MainActivity shows details of how to subscribe and publish event. LicenseBSD-3-Clause. See the BSD-3-Clause file for details. Support
|
请发表评论