菜鸟初识AIDL进程通信
2015-12-25 18:41
519 查看
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文件里面需要定义接口,以供其它进程能够访问,
然后就是需要新建一个继承于Service的类,这里有郭神的Service详解,http://blog.csdn.net/guolin_blog/article/details/11952435。
然后就是要在Activity里面去BindService了,
如果想要在其他的应用程序中也要用到这个Service怎么办呢,so
easy~
先把上面.aidl文件生成的R文件的包,拷贝到应用程序的src目录下
然后,怎么办呢,看代码
好了,基础的AIDL通信,已经完结了,各位期待,我深入了解哦!
为了使其他的应用程序也可以访问本应用程序提供的服务,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。
@Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return mBinder; } service.Stub mBinder=new Stub(){ @Override public String getBook() throws RemoteException { // TODO Auto-generated method stub return "wo"; } @Override public String getBookName() throws RemoteException { // TODO Auto-generated method stub return "ta"; } };上面这段代码就是在Service中需要实现的接口,通过Binder机制来实现数据的传递,此处有Binder机制的详解,/article/5171274.html
然后就是要在Activity里面去BindService了,
Button btn; private service myAIDLService; private MyService.MyBinder iBinder; private ServiceConnection connection=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { // TODO Auto-generated method stub myAIDLService=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(); } } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub } }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn=(Button) findViewById(R.id.menu); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent 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(){ @Override public void onServiceConnected(ComponentName arg0, IBinder arg1) { // TODO Auto-generated method stub myAIDLService=service.Stub.asInterface(arg1); } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub } }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.menu_layout2); btn=(Button) findViewById(R.id.menu2); btn2=(Button) findViewById(R.id.menu3); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent bindIntent=new Intent("com.example.animation.service"); bindIntent.setPackage("com.example.animation"); bindService(bindIntent, connection, BIND_AUTO_CREATE); } }); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(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 block e.printStackTrace(); } Log.i("myServiceActivity22", result); Log.i("myServiceActivity22", name); } }); }
好了,基础的AIDL通信,已经完结了,各位期待,我深入了解哦!
相关文章推荐
- error: ‘asm’ operand has impossible constraints
- JetBrains转向全新订阅模式,更换全线产品logo
- list.contains()方法的使用
- Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused(MongoDB启动异常)
- ld: 1 duplicate symbol for architecture arm64 clang: error: linker command failed with exit code 1
- Xcode7真机测试libUMSocial_Sdk_4.2.2.a(UMSShareListController.o)' does not contain bitcode.
- iRedMail的搭建过程记录
- 【学习笔记】paint类
- Lind.DDD.Domain领域模型介绍
- 模拟器的创建 提示 No CPU/ABI system image available for this target
- sendEmail
- Genymotion安装failed to import ova解决办法
- Root Pane Container(四)
- Root Pane Container(三)
- Root Pane Container(二)
- RAID学习总结
- pthread_cond_wait() 使用
- Root Pane Containers(一)
- 【Codeforces Round 272 (Div 2)A】【贪心 暴力 水题】Dreamoon and Stairs n个台阶每次走一步或两步是否有步数恰好为m倍数
- VS MainPage.xmal 设计器打不开解决方案