AIDL:Android Interface Definition Language,即Android接口定义语言。

为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。我们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。


那么该如何实现AIDL通信呢?

首先新建一个.aidl的文件,然后会自动在R文件下生成一个.java的文件,如图


aidl文件里面需要定义接口,以供其它进程能够访问,

package com.example.animation;interface service{String getBook();String getBookName();}

然后就是需要新建一个继承于Service的类,这里有郭神的Service详解, http://blog.csdn.net/guolin_blog/article/details/11952435。

@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn mBinder;}service.Stub mBinder=new Stub(){@Overridepublic String getBook() throws RemoteException {// TODO Auto-generated method stubreturn "wo";}@Overridepublic String getBookName() throws RemoteException {// TODO Auto-generated method stubreturn "ta";}};
上面这段代码就是在Service中需要实现的接口,通过Binder机制来实现数据的传递,此处有Binder机制的详解, http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html 


然后就是要在Activity里面去BindService了,

Button btn;private service myAIDLService;private MyService.MyBinder  iBinder;private ServiceConnection connection=new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {// TODO Auto-generated method stubmyAIDLService=service.Stub.asInterface(arg1);try{String result=myAIDLService.getBook();String name=myAIDLService.getBookName();Log.i("myServiceActivity", result);Log.i("myServiceActivity", name);}catch(Exception e){e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stub}};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=(Button) findViewById(R.id.menu);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent bindIntent=new Intent(MyServiceActivity.this,MyService.class);bindService(bindIntent, connection, BIND_AUTO_CREATE);}});}
别忘了,还要注册哦。



如果想要在其他的应用程序中也要用到这个Service怎么办呢,so easy~ 

先把上面.aidl文件生成的R文件的包,拷贝到应用程序的src目录下


然后,怎么办呢,看代码

Button btn,btn2;private service myAIDLService;private ServiceConnection connection=new ServiceConnection(){@Overridepublic void onServiceConnected(ComponentName arg0, IBinder arg1) {// TODO Auto-generated method stubmyAIDLService=service.Stub.asInterface(arg1);}@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stub}};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.menu_layout2);btn=(Button) findViewById(R.id.menu2);btn2=(Button) findViewById(R.id.menu3);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent bindIntent=new Intent("com.example.animation.service");bindIntent.setPackage("com.example.animation");bindService(bindIntent, connection, BIND_AUTO_CREATE);}});btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif(myAIDLService==null){Log.i("myAIDLService", "null");return;}String result = null;String name = null;try {result=myAIDLService.getBook();name = myAIDLService.getBookName();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}Log.i("myServiceActivity22", result);Log.i("myServiceActivity22", name);}});}

好了,基础的AIDL通信,已经完结了,各位期待,我深入了解哦!



 

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. build.gradle配置参数详解
  6. [置顶] Android学习系列-把文件保存到SD卡上面(6)
  7. Android(安卓)——对AsyncTask的理解和注意事项
  8. Android(安卓)调试查看内存使用情况
  9. Android(安卓)配置 OpenCV2.3.1

随机推荐

  1. sqlserver 错误602,未能在sysindexes中找
  2. SQL 超时解决方案 有时并不是设置问题
  3. 分页存储过程(三)在sqlserver中打造更加准
  4. 分页存储过程(二)在sqlserver中返回更加准
  5. SqlServer 执行计划及Sql查询优化初探
  6. SQLServer 使用ADSI执行分布式查询Active
  7. sqlserver 支持定位当前页,自定义排序的
  8. SQL Server 分页查询存储过程代码
  9. SQL 重复记录问题的处理方法小结
  10. SQL Server 服务由于登录失败而无法启动