最近项目有进程间通讯的需求,我使用的是IPC通讯的方式,这是Android中很传统的一种进程间通讯的方式,在这里分享给你们。javascript
咱们为何要使用进程间通讯。我说一个场景,好比咱们有两个App,其中一个App(名字为A),有受权登录,咱们还有一个App(名字为B)多是A的附属App,或者同期产品,咱们但愿有相同的帐号,也就是A登录了,B就自动登陆了。那么B在进入的时候须要从A中拿登录信息,好比姓名性别,昵称等。这时候就涉及到进程间通讯了。或者B中须要一些加密算法,咱们不想在B中暴露,能够把值传给A,而后A计算完再传递回来。
固然还有其它场景,这里再也不赘述了。java
首先咱们固然要创建一个工程,最普通的工程就能够。android
这个工程中的第一个module服务端module,也就是上面提到的A app,内容提供的app
咱们在src/main中创建一个aidl文件夹:算法
在里面创建一个文件,好比咱们想获取用户信息:app
interface IPeople {
/** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */
String getName();
String getSex();
}复制代码
而后rebuild一下工程,这时,会在build文件夹下生成一个文件ide
public class AidlService extends Service{
private PeopleBinder peopleBinder;
@Override
public void onCreate() {
super.onCreate();
peopleBinder = new PeopleBinder();
}
@Override
public IBinder onBind(Intent intent) {
return peopleBinder;
}
public class PeopleBinder extends IPeople.Stub {
@Override
public String getName() throws RemoteException {
return "deep";
}
@Override
public String getSex() throws RemoteException {
return "man";
}
}
}复制代码
其中PeopleBinder是进程间传递数据的媒介,若是你想传一个数据类,那么这个数据类必定要序列化。PeopleBinder实现的接口,就是刚才咱们生成的那个文件中的接口。因此必定要等aidl接口文件生成咱们再去写这个类。
而后将Service注册在AndroidManifest中,注意要加一个action,方便客户端App启动:布局
<service android:name=".AidlService">
<intent-filter> <action android:name="deep.testaidl.AidlService"/> </intent-filter> </service>复制代码
要注意app要安装到手机上啊,不然后面怎么获取……学习
咱们新建一个module,这个module就是客户端App,也就是咱们上文中提到的B App,内容索取者。
用一样的方式创建一个aidl文件,这个aidl文件要与上面的同样,且路径也要同样,如图所示:ui
private IPeople people;//协议接口复制代码
接着须要创建一个服务链接,与服务端App刚写的那个Service进行链接通讯:加密
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
people = IPeople.Stub.asInterface(service);//链接创建成功,读取数据
try {
textView.setText("name ="+people.getName()+" sex="+people.getSex());
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
people = null;
}
};复制代码
刚才不是写了一个按钮吗,添加一个点击事件,打开服务端写好的Service,进行通讯:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("deep.testaidl.AidlService");
intent.setPackage("deep.testaidl");
bindService(intent,conn, Service.BIND_AUTO_CREATE);
}
});复制代码
因为咱们刚才在服务链接的回调中,将用户信息设置到了textview上,这样就能够显示出来了。
好了,这样一次通讯就完成了,是否是没有想象的复杂。
这种进程间通讯的方式仍是比较传统的,用的也比较多,了解一下对于之后的学习颇有帮助,若有其它问题能够关注个人公众号留言给我,我会第一时间回复。
更多的开发知识,能够关注个人公众号: