最近需要使用到进程通信,琢磨了一下,大致到了入门级别吧,还是随便写点,当自己以后看的笔记吧。
这边给出一个例子,这个例子网上有,原文http://blog.csdn.net/macdroid/article/details/8448742
自己试着照做了一遍,大致明白了这个原理。
要实现进程间的通信,大致分两块:
Server端:
- 配置aidl文件,里面需要定义你的接口,以及方法,(例如IPerson.aidl,保存之后,Eclipse会自动在gen目录下生成IPerson.java文件)Aidl文件内容如下:
package com.example.aidl;
interface IPerson {
void setValue(String name);
String getValue();
}
注:aidl文件的创建,new-->File--->直接FileName中输入IPerson.aidl
- 在需要用到数据源(Person)的地方去继承IPerson.Stub,该类需要放到与aidl文件同一个包下
package com.example.aidl;
import android.os.RemoteException;
/**
* 必须要和aidl文件放到一个包下
* @author cxq
*
*/
public class Person extends IPerson.Stub {
private String name;
@Override
public void setValue(String name) throws RemoteException {
android.util.Log.e("cxq", "赋值" + name);
this.name = name;
}
@Override
public String getValue() throws RemoteException {
android.util.Log.e("cxq", "获取" + name);
return name;
}
}
- 配置通信的Service,编写Service类+配置Manifest文件,
package com.example.aidlserver;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import com.example.aidl.IPerson.Stub;
import com.example.aidl.Person;
public class ServiceC extends Service{
private Stub iPerson = new Person();
@Override
public IBinder onBind(Intent arg0) {
Log.i("service", "onBind...");
return iPerson;
}
}
<service android:name="com.example.aidlserver.ServiceC" >
<intent-filter>
<action android:name="forServiceAidl" >
</action>
</intent-filter>
</service>
- 本地(Server端)通过bindService进行通信的方法
private ServiceConnection conn = new ServiceConnection() {
// 断开连接时调用
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
// 连接时调用
@Override
public void onServiceConnected(ComponentName arg0, IBinder binder) {
iPerson = IPerson.Stub.asInterface(binder);
if (iPerson != null) {
try {
iPerson.setValue("Service AIDL");
Toast.makeText(ServerActivity.this, "赋值成功!",
Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(ServerActivity.this, "赋值失败!",
Toast.LENGTH_LONG).show();
}
}
}
};
开启Service
bindService(new Intent("forServiceAidl"), conn,
Service.BIND_AUTO_CREATE);
关闭Service
unbindService(conn);
Client端:
- 配置aidl,这里需要注意:包名和文件要和Server端保持一致,可以直接从Server端复制过来
- 通过bindService 进行通信
private ServiceConnection conn = new ServiceConnection() {
private IPerson person;
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
// 因为有可能有多个应用同时进行RPC操作,所以同步该方法
@Override
public synchronized void onServiceConnected(ComponentName arg0,
IBinder binder) {
// 获得IPerson接口
person = IPerson.Stub.asInterface(binder);
if (person != null) {
try {
// RPC方法调用
person.setValue("ss");
String name = person.getValue();
Toast.makeText(ClientActivity.this,
"远程进程调用成功!值为 : " + name, Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
Toast.makeText(ClientActivity.this, "远程进程调用失败! ",
Toast.LENGTH_LONG).show();
}
}
}
};
bindService(new Intent("forServiceAidl"), conn,
Service.BIND_AUTO_CREATE);
http://download.csdn.net/detail/cxq234843654/9229949