跨进程的binder通信即是使用AIDL的通信方式,AIDL的语法与java中的interface语法一致。
Service在声明的时候,如果android:process的value不是":"开头,则系统里有同样名字的进程的话,会放到已存在的同名进程里运行,这样能减小消耗;如果android:process的value是以":"开头,则启动一个以【当前包名:value】为名字的进程的进程。
我这里是用的新启动一个进程,AndroidManifest.xml中的服务声明如下:
<service
android:name="com.test.multiprocesstest.BackService"
android:process=":com.newearth.service" >
<intent-filter>
<action android:name="com.test.service" />
</intent-filter>
</service>
在源码目录下,创建一个扩展名为aidl的文件,则在Eclipse中会自动在gen文件夹下生成对应的java文件
其中IserviceProxy.aidl代码如下:
package com.test.multiprocesstest;
interface IServiceProxy {
String test();
}
则在BackService.java 中用内部类实现此接口,并覆写onBind方法即可:
public class BackService extends Service{
@Override
public void onCreate() {
super.onCreate();
Log.i("SSSS","Service-create-PID:"+android.os.Process.myPid());
//Log.i("SSSS",Student.name);
Log.i("SSSS","service 创建");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
Log.i("SSSS","service 启动");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return new InnerService();
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
Log.i("SSSS","service被销毁");
}
public void test(){
Log.i("SSSS","Service-test-PID:"+android.os.Process.myPid());
}
private class InnerService extends IServiceProxy.Stub{
@Override
public String test() throws RemoteException {
// TODO Auto-generated method stub
BackService.this.test();
Log.i("SSSS","innerService--PID:"+android.os.Process.myPid());
return "inner-service-test";
}
}
}
在MainActivity中用bind的方式启动service,需要一个ServiceConnection对象:
Intent intent=new Intent("com.test.service");
bindService(intent, new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
IServiceProxy proxy= IServiceProxy.Stub.asInterface(service);
try {
Log.i("SSSS","activity--getServicePID:"+proxy.test());
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, Context.BIND_AUTO_CREATE);
这样即可做到两个进程间的通信。