声明:本博文只对aidl的简单讲解,不作为深入理解,仅供新手使用。不喜勿喷!
华丽的分割线
----------------------------------------------------------------------------------------
开篇,今天我们来讲解下android进程间通信最为重要,也是最麻烦的一种方式-service。
什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,“接口定义语言”。
它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。
废话少说接下来讲解下他的使用:
服务端========================================================
第一步:
在项目中创建一个包,命名aidl;
在包里新建一个文件,后缀为.aidl;
里面第一句和java里面一样导入包名;
下面 声明接口 和接口名称,名称要和定义好的adil文件对应;
在接口里面定义好方法。ok 如图。
这样 一个aidl就创建好了。
ps:编译你的aidl文件,这个只要是在eclipse中开发,你的adt插件会像资源文件一样把aidl文件编译成java代码生成在gen文件夹下,不用手动去编译
第二步:
打开系统生成的java文件,我们会发现一个Stub类(存根的意思):public static abstract class Stub extends android.os.Binder implements com.hoo.test.aidl.MyAIDLService,我们需要实现接口方法,下面是我在例子中实现的Stub类:
客户端现在做的任务是,创建一个service(继承service类),在里面来返回一个stub的实例,即:new Stub。
在minafest里来配置我们的service 并指定好action。
此时我们的服务端就基本完成了。
-------------------------------------------------------------------------分割线-------------------------------------------------------------------------
客户端:
创建一个项目 testAct
将服务端的MyAIDLService按原路径copy到我们的客户端项目中,如图:
接下来是我们具体页面的操作。
在调用AIDL服务之前需要先使用bindService方法绑定AIDL服务。bindService方法需要一个ServiceConnection对象。ServiceConnection有一个onServiceConnected方法,当成功绑定AIDL服务且,该方法被调用。并通过service参数返回AIDL服务对象。(该句引用)
public class MainActivity extends Activity {
private MyAIDLService myStub;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
if (service != null) {
myStub = MyAIDLService.Stub.asInterface(service);
}
try {
// 调用AIDL服务对象中的getValue方法,并以对话框中显示该方法的返回值
new AlertDialog.Builder(MainActivity.this).setMessage(0)
.setPositiveButton("确定", null).show();
} catch (Exception e) {
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
myStub = null;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void btn_ok(View v) {
Bundle args = new Bundle();
Intent intent = new Intent("come.hoo.test.service.AIDLServiceImpl");
intent.putExtras(args);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
运行ok!!!!