第一步:新建两个app工程:
如名字所示,testAidlClient 是客户端App,testAidlServer 是服务端App。
testAidlClient 的工程结构如图:
和平常新建工程的不同之处在于,多了一个包: com.mjw.aidl
有一个后缀名为aidl的文件 : Imjw.aidl
Imjw.aidl 文件里面的代码如下
package com.mjw.aidl;
interface Imjw{
int add (int a,int b );
}
MainActivity.java 里的代码如下
package com.example.testaidl;
import com.mjw.aidl.Imjw;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.widget.TextView;
public class MainActivity extends Activity {
TextView view;
Imjw imjw;
private ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
imjw=null;
}
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
// TODO Auto-generated method stub
imjw=Imjw.Stub.asInterface(iBinder);
try {
view.setText(String.valueOf(imjw.add(2, 4)));
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
view=(TextView) findViewById(R.id.num);
Intent intent=new Intent();
intent.setComponent(new ComponentName("com.example.testaidlserver", "com.example.testaidlserver.ImjwService"));
bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
}
客户端的代码构建完毕。
testAidlServer 的工程结构如图:
ImjwService 的代码如下所示:
package com.example.testaidlserver;
import com.mjw.aidl.Imjw;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class ImjwService extends Service{
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return iBinder;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
Log.d("mjw", "ImjwService onCreate");
}
private IBinder iBinder=new Imjw.Stub() {
@Override
public int add(int a, int b) throws RemoteException {
// TODO Auto-generated method stub
return a+b;
}
};
}
MainActivity 的代码如下所示:
package com.example.testaidlserver;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=new Intent("com.example.testaidlserver.ImjwService");
startService(intent);
}
}
服务端工程内 Imjw.aidl 文件里面的代码和客户端的一致。
注意:服务端的manifest 的Service 配置需要添加 intent-filter,如下图:
这样,其他外部应用才可以访问服务端的Service
服务端的代码构建完毕。
第二步:先运行服务端,再运行客户端。
然后,客户端运行的效果无意外如下图所示:
示例完毕。
解释一下:
在服务端跑起来后,如代码所示,它会开启一个服务,服务里的 iBinder 会在它被客户端绑定的时候,即客户端中MainActivity的 ServiceConnection里的onServiceConnected方法被回调后,客户端那边就可以得到方法里的一个参数 IBinder iBinder。由于iBinder 持有了接口的实例,那么,客户端就可以通过 iBinder 调用 接口的 add 方法,并返回一个计算结果。