最近博主在做一个项目要求用到AIDL调用,于是研究了半天终于弄明白了,在这里给入门的同学说一下:
首先,在eclipse下新建两个工程 工程1 和 工程2
我们把工程1作为被调用的工程,工程2作为主调工程.
上图是项1的树形图。
包里有一个AIDL文件。。
这就是接口文件,在里面定义了接口。
然后通过Android的Service实现了里面的接口。
MyAIDL.aidl文件内容如下,语法跟java类似,里面只定义了一个接口
interface MyAIDL{
void print(in String str);
}
MyAILDService.java文件内容如下:注意观察是怎么跟aidl文件建立联系的。另一个activity文件不用管他。。
package uestc.muhuan;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyAIDLService extends Service {
private MyAIDL.Stub mBind = new MyAIDL.Stub() {
@Override
public void print(String str) throws RemoteException {
// TODO Auto-generated method stub
System.out.println(str);
}
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return mBind;
}
}
最后比比较重要的一点就是在项目1的Manifest文件中要注册你的service,同时要为你的sevice加上一个action标记。
如下所示:
<service
android:name=".MyAIDLService"
android:process=":remote" //这一行网上说远程调用必须得有,但是本人测试发现 //有可无,只是在有这一句的时候,系统会多出一个remote进程,但是不影响 // 功能,水平有限,不知何故。
>
<intent-filter >
<action android:name="uestc.muhuan.service_action" >
</action>
</intent-filter>
</service>
到此为止,项目1完工了,把这个工程烧到你的手机,或者模拟器上。
下面这部分是项目2:
上图是项目2的树形图,注意看在项目2里有一个跟项目1一样的包,包里同样有一个AIDL文件,这个文件跟项目1 的文件是一模一样的 直接拖过来就好了。。但是注意这里面没有Service实现文件。。
MyAIDLTest2Activity.java 的代码如下
package uestc.muhua;
import uestc.muhuan.MyAIDL;
import uestc.muhua.R;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
public class MyAIDLTest2Activity extends Activity {
private MyAIDL myAIDL = null;
ServiceConnection sConnection = 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
myAIDL = MyAIDL.Stub.asInterface(service);
try {
myAIDL.print("nihao2");
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("2qidong");
setContentView(R.layout.main);
init();
}
private void init() {
this.bindService(new Intent("uestc.muhuan.service_action"),
sConnection, BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
this.unbindService(sConnection);
super.onDestroy();
}
}
其实很简单,就是通过ServiceConnect绑定服务,然后得到实例,调用接口。。。一气呵成。呵呵。
看来上面的代码是不是很简单啊。。
欢迎大家交流。。