菜鸟初识AIDL进程通信
16lz
2021-01-25
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通信,已经完结了,各位期待,我深入了解哦!
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- build.gradle配置参数详解
- [置顶] Android学习系列-把文件保存到SD卡上面(6)
- Android(安卓)——对AsyncTask的理解和注意事项
- Android(安卓)调试查看内存使用情况
- Android(安卓)配置 OpenCV2.3.1