RPC进程通信框架
接口为客户端进程能够调用的方法,由服务端进程实现,指定@Service注解
@Service("music")
public interface IMusicService {
boolean play(String music);
void stop();
}定义服务继承自XIPCService,同时指定注解@Service,注解参数需要和接口一致
@Service("music")
public class MusicService extends XIPCService {
@Override
public void onCreate() {
super.onCreate();
}
}实现接口:
public class MusicServiceImpl implements IMusicService {
@Override
public boolean play(String music) {
//......
return true;
}
@Override
public void stop() {
}
}XIPCConfig xipcConfig = new XIPCConfig.Builder()
.context(this)
.addService(MusicService.class) //添加服务端Service
.build();
XIPC.init(xipcConfig);xipcConfig = new XIPCConfig.Builder()
.context(this)
.build();
XIPC.init(xipcConfig);
XIPC.register(new MusicServiceImpl()); //注册服务实现public class MainActivity extends AppCompatActivity {
private XServiceCall<IMusicService> call;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
call = XIPC.newCall(IMusicService.class);
XServiceCall.Listener<IMusicService> listener =
new XServiceCall.Listener<IMusicService>() {
@Override
public void create(IMusicService iMusicService) {
boolean result = iMusicService.play("客户端传递数据!");
}
};
call.connect(listener);
}
@Override
protected void onDestroy() {
super.onDestroy();
//断开服务连接
call.disconnect();
}
}1.1、定义服务接口
Process注解指定服务端进程名:
@Service("music")
@Process("com.enjoy.xipc.servicesample")
public interface IMusicService {
boolean play(String music);
void stop();
}1.2、实现接口:
public class MusicServiceImpl implements IMusicService {
@Override
public boolean play(String music) {
//......
return true;
}
@Override
public void stop() {
}
}1.3、定义Android Service
不再需要指定任何注解:
public class MusicService extends XIPCService {
@Override
public void onCreate() {
super.onCreate();
}
}1.4、初始化
XIPCConfig xipcConfig = new XIPCConfig.Builder().context(this)
.build();
XIPC.init(xipcConfig);
XIPC.register(new TestServiceImpl());1、定义与服务端一致的接口,无需在意包名:
@Service("music")
@Process("com.enjoy.xipc.servicesample")
public interface IMusicService {
boolean play(String music);
void stop();
}2、初始化
XIPCConfig xipcConfig = new XIPCConfig.Builder().context(this)
//注册服务 进程名(需要与接口Process一致):Service全限定名
.addService("com.enjoy.xipc.servicesample",
"com.enjoy.xipc.servicesample.MainService")
.build();
XIPC.init(xipcConfig);3、通信
public class MainActivity extends AppCompatActivity {
private XServiceCall<IMusicService> call;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
call = XIPC.newCall(IMusicService.class);
XServiceCall.Listener<IMusicService> listener =
new XServiceCall.Listener<IMusicService>() {
@Override
public void create(IMusicService iMusicService) {
boolean result = iMusicService.play("客户端传递数据!");
}
};
call.connect(listener);
}
@Override
protected void onDestroy() {
super.onDestroy();
//断开服务连接
call.disconnect();
}
}目前默认支持了基础数据类型(含基本数据类型的包装类型与数组)和实现了Parcelable接口的数据类型的自动序列化,如果需要支持其他数据类型,需要提供该数据类型的TypeAdapter实现类,并在XIPC初始化时完成注册。
自定义数据类型User
public class User {
String name;
String pwd;
public User(String name, String pwd) {
this.name = name;
this.pwd = pwd;
}
}实现TypeAdapter接口
TypeAdapter接口需要实现三个方法:
- handles: 是否支持对象类型的序列化
- writeToParcel:序列化对象
- readFromParcel:反序列化对象
无论是序列化还是反序列化需要通过Parcel记录或读取数据。甚至还可以将对象转成JSON字符串,只需要将JSON字符串交给Parcel操作就可以。
public class UserAdapter implements TypeAdapter {
@Override
public boolean handles(Object o) {
return o instanceof User;
}
@Override
public void writeToParcel(Object o, Parcel dest) {
User u = (User) o;
dest.writeString(u.name);
dest.writeString(u.pwd);
}
@Override
public Object readFromParcel(Parcel in) {
String name = in.readString();
String pwd = in.readString();
return new User(name,pwd);
}
}XIPCConfig config = new XIPCConfig.Builder()
.context(this)
.addAdapter(new UserAdapter())
.build();
XIPC.init(config);