我的Android开源之旅

XIPC 一个Android通用的IPC(进程通信)框架。

2018-09-24  本文已影响9人  xuexiangjys

XIPC

项目地址

一个Android通用的IPC(进程通信)框架。该项目主要是模仿饿了么开源项目Hermes的设计进行的自我理解改写。

演示(请star支持)

demo.gif

apk下载

远程服务应用

服务调用应用

特征

实现原理

该框架主要使用以下技术实现:

详细实现原理请点击查看

如何使用

1.先在项目根目录的 build.gradle 的 repositories 添加:

allprojects {
     repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.然后在dependencies添加:

dependencies {
  ...
  implementation 'com.github.xuexiangjys:XIPC:1.0.1'
}

3.最后在Application中注册接口服务:

XIPC.init(this);
XIPC.debug(BuildConfig.DEBUG);

//本地只需要注册实现,无需注册接口
XIPC.register(UserManager.class);
XIPC.register(LoadingTask.class);
XIPC.register(FileUtils.class);
XIPC.register(LoadingCallback.class);
XIPC.register(ComputeService.class);

//远程注册接口
//注册包名下的所有定义的服务接口
XIPC.register("com.xuexiang.remotedemo.service");


如何实现跨应用通信

1.接口定义和实现

(1)首先我们需要定义一套统一的交互接口。使用@ClassName@MethodName进行修饰。

@ClassName("ComputeService")
public interface IComputeService {
    /**
     * 计算
     * @param value1 值1
     * @param symbol 算数符号
     * @param value2 值2
     * @return
     */
    @MethodName("calculate")
    float calculate(float value1, String symbol, float value2);
}

(2)根据定义的接口,进行具体实现。使用@ClassName@MethodName进行修饰。这里需要注意注解中的内容要和之前定义的接口一一对应。

@ClassName("ComputeService")
public class ComputeService implements IComputeService {
    @Override
    @MethodName("calculate")
    public float calculate(float value1, String symbol, float value2) {
        float result;
        switch(symbol) {
            case "+":
                result = value1 + value2;
                break;
            case "-":
                result = value1 - value2;
                break;
            case "*":
                result = value1 * value2;
                break;
            case "/":
                result = value1 / value2;
                break;
            default:
                result = value1 + value2;
                break;
        }
        return result;
    }
}

2.注册

(1)注册接口和实现类。对于调用App而言,只需要注册接口即可;对于被调用App而言,只需要注册实现类和回调接口即可。统一在Application的onCreate中进行注册。

//被调用App,无需注册接口
XIPC.register(UserManager.class);
XIPC.register(LoadingTask.class);
XIPC.register(FileUtils.class);
XIPC.register(LoadingCallback.class);
XIPC.register(ComputeService.class);

//调用App,只需要注册接口和回调函数
XIPC.register("com.xuexiang.remotedemo.service");//该方法注册包名下的所有定义的服务接口

(2)被调用App需在manifest中注册IPC通信服务。可以使用默认的IPCService0服务,也可以继承IPCService进行自定义通信服务。

<service
    android:name="com.xuexiang.xipc.core.channel.IPCService$IPCService0"
    android:process=":remote"
    android:exported="true" />

3.服务绑定

(1)在调用前,请先进行绑定,绑定IPC通信服务。

XIPC.connectApp(getContext(), "com.xuexiang.xipcdemo"); //这里设置的是被调用App的包名

(2)当然你也可以设置绑定的监听回调,以判断服务绑定是否成功。

XIPC.setIPCListener(new IPCListener() {
        @Override
        public void onIPCConnected(Class<? extends IPCService> service) {
            ToastUtils.toast("IPC服务已绑定!");
        }
    });

4.获取实例访问

XIPC提供三种访问的方式:

IComputeService computeService = XIPC.getService(IComputeService.class);
ToastUtils.toast("3*4=" + computeService.calculate(3 , "*", 4));

5.服务解绑

当不再需要服务访问时,我们需要及时地进行服务解绑,回收资源。

XIPC.disconnect(getContext());

注意事项

在接口注册方面

总之为了防止出现各种各样不匹配或者找不到的问题,最好还是使用@ClassName@MethodName注解,进行一一对应修饰并在Application的onCreate中进行注册。

在接口定义方面

在接口回调方面

其他方面

混淆配置

# xipc
-keep @com.xuexiang.xipc.annotation.* class * {*;}
-keep class * {
    @com.xuexiang.xipc.annotation.* <fields>;
}
-keepclassmembers class * {
    @com.xuexiang.xipc.annotation.* <methods>;
}

特别感谢

https://github.com/Xiaofei-it/Hermes

联系方式

img_qq_qun.jpg
上一篇 下一篇

猜你喜欢

热点阅读