打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Android之AIDL使用解析

原文:http://blog.csdn.net/chenzujie/article/details/7791968

我们都知道android程序内的数据共享比较容易理解,毕竟在一个程序内。但如果android程序与程序之间应该如何共享并传递数据呢?毕竟一个程序不能访问另一个程序的内存空间,因此android提供了AIDL工具来将对象分解成操作系统可以理解的基本单元,并且有序的通过进程边界,在不同程序间传递。具体使用方法如下:

(一)创建服务器端程序,发送数据的一方。


1、创建.aidl文件

IAIDLServerService.aidl:

  1. package com.jackchan.aidlserver;  
  2.   
  3. import com.jackchan.aidlserver.Book;  
  4. interface IAIDLServerService{  
  5.     String sayHello();  
  6.       
  7.     Book getBook();  
  8. }  



该aidl文件里声明一个接口,该接口包含一些方法,这些方法所带的参数和返回值必须为以下类型:
1)、java语言的所有基本类型,如int float long char boolean 等;
2)、String CharSequence List Map,其中List和Map里的元素也必须是1)和2)所说的这些数据类型或者其他你定义的.aidl数据接口和Parcelable对象。
例如这里的Book返回值就是一个Parcelable对象,它的代码如下:

Book.java:


  1. package com.jackchan.aidlserver;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5.   
  6. public class Book implements Parcelable{  
  7.       
  8.     private String bookName;  
  9.     private int bookPrice;  
  10.       
  11.     public Book(){  
  12.           
  13.     }  
  14.     public Book(Parcel parcel){  
  15.         bookName = parcel.readString();  
  16.         bookPrice = parcel.readInt();  
  17.     }  
  18.     public String getBookName() {  
  19.         return bookName;  
  20.     }  
  21.     public void setBookName(String bookName) {  
  22.         this.bookName = bookName;  
  23.     }  
  24.     public int getBookPrice() {  
  25.         return bookPrice;  
  26.     }  
  27.     public void setBookPrice(int bookPrice) {  
  28.         this.bookPrice = bookPrice;  
  29.     }  
  30.     @Override  
  31.     public int describeContents() {  
  32.         // TODO Auto-generated method stub  
  33.         return 0;  
  34.     }  
  35.   
  36.     @Override  
  37.     public void writeToParcel(Parcel dest, int flags) {  
  38.         // TODO Auto-generated method stub  
  39.         dest.writeString(bookName);  
  40.         dest.writeInt(bookPrice);  
  41.     }  
  42.       
  43.     public static final Parcelable.Creator<Book> CREATOR = new Creator<Book>(){  
  44.   
  45.         @Override  
  46.         public Book createFromParcel(Parcel source) {  
  47.             // TODO Auto-generated method stub  
  48.             return new Book(source);  
  49.         }  
  50.   
  51.         @Override  
  52.         public Book[] newArray(int size) {  
  53.             // TODO Auto-generated method stub  
  54.             return new Book[size];  
  55.         }  
  56.           
  57.     };  
  58. }  



Book.aidl:

  1. parcelable Book;  

这里你会发现gen里的文件夹会自动生成一些文件,这些文件不用去修改它。
2、实现你刚刚定义的接口
我们刚刚在.aidl里定义的接口会有一个Stub的子类(yourInterface.Stub),我们新建一个类继承自Service,并在这个类中复写刚刚.aidl里的抽象方法。


  1. package com.jackchan.aidlserver;  
  2.   
  3. import com.jackchan.aidlserver.IAIDLServerService.Stub;  
  4.   
  5. import android.app.Service;  
  6. import android.content.Intent;  
  7. import android.os.IBinder;  
  8. import android.os.RemoteException;  
  9.   
  10. public class AidlServerService extends Service{  
  11.       
  12.     @Override  
  13.     public IBinder onBind(Intent arg0) {  
  14.         // TODO Auto-generated method stub  
  15.         return mBinder;  
  16.     }  
  17.       
  18.     private IAIDLServerService.Stub mBinder = new Stub(){  
  19.               
  20.         @Override  
  21.         public String sayHello() throws RemoteException {  
  22.             return "Hello";  
  23.         }  
  24.           
  25.         @Override  
  26.         public Book getBook() throws RemoteException {  
  27.             Book mBook = new Book();  
  28.             mBook.setBookName("Android应用开发");  
  29.             mBook.setBookPrice(50);  
  30.             return mBook;  
  31.         }  
  32.     };  
  33. }  


这里的IAIDLServerService.Stub其实也是一个IBinder的子类,因此我们可以把他作为Service的onBind的返回值,一旦这个Service被其他程序的服务绑定,就将这个IBinder类实例发送出去,同样这个实例里重写的方法数据也跟着一起发送出去。
运行服务器端如下效果(首界面我们不做任何处理)








以上就是我们服务器端发送数据的代码,接下来我们看看怎么进行接收。
(二)创建客户端程序



1、首先得把服务器程序里关于要共享数据的接口的代码连同包一起拷过来(上图红框部分)。
2、当客户端调用bindService()方法就将绑定到指定Service,


  1. Intent service = new Intent("com.jackchan.aidlserver.IAIDLServerService");  
  2.                 bindService(service, mConnection, BIND_AUTO_CREATE);  


并且客户端的OnServiceConnected()方法里调用IAIDLServerService.Stub.asInterface()将得到服务器端OnBind方法里IBinder类实例


  1. @Override  
  2.         public void onServiceConnected(ComponentName name, IBinder service) {  
  3.             // TODO Auto-generated method stub  
  4.               
  5.             mIaidServerService = IAIDLServerService.Stub.asInterface(service);            
  6.             try{  
  7.                 String mText = "Say Hello:" + mIaidServerService.sayHello() + "\n";  
  8.                 mText += "书名:" + mIaidServerService.getBook().getBookName() + "\n";  
  9.                 mText += "价格:" + mIaidServerService.getBook().getBookPrice();  
  10.                 mTextView.setText(mText);  
  11.             }  
  12.             catch(RemoteException e){  
  13.                 e.printStackTrace();  
  14.             }  
  15.         }  



整个客户端完整代码如下:


  1. package com.jackchan.aidlclient;  
  2.   
  3. import com.jackchan.aidlserver.IAIDLServerService;  
  4.   
  5. import android.os.Bundle;  
  6. import android.os.IBinder;  
  7. import android.os.RemoteException;  
  8. import android.app.Activity;  
  9. import android.content.ComponentName;  
  10. import android.content.Intent;  
  11. import android.content.ServiceConnection;  
  12. import android.util.Log;  
  13. import android.view.Menu;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.Button;  
  17. import android.widget.TextView;  
  18.   
  19. public class AIDLClientActivity extends Activity {  
  20.       
  21.     private TextView mTextView;  
  22.     private Button mButton;  
  23.       
  24.     private IAIDLServerService mIaidServerService = null;  
  25.       
  26.     private ServiceConnection mConnection = new ServiceConnection(){  
  27.   
  28.         @Override  
  29.         public void onServiceConnected(ComponentName name, IBinder service) {  
  30.             // TODO Auto-generated method stub  
  31.               
  32.             mIaidServerService = IAIDLServerService.Stub.asInterface(service);            
  33.             try{  
  34.                 String mText = "Say Hello:" + mIaidServerService.sayHello() + "\n";  
  35.                 mText += "书名:" + mIaidServerService.getBook().getBookName() + "\n";  
  36.                 mText += "价格:" + mIaidServerService.getBook().getBookPrice();  
  37.                 mTextView.setText(mText);  
  38.             }  
  39.             catch(RemoteException e){  
  40.                 e.printStackTrace();  
  41.             }  
  42.         }  
  43.   
  44.         @Override  
  45.         public void onServiceDisconnected(ComponentName name) {  
  46.             // TODO Auto-generated method stub  
  47.             mIaidServerService = null;  
  48.         }  
  49.           
  50.           
  51.     };  
  52.     @Override  
  53.     public void onCreate(Bundle savedInstanceState) {  
  54.         super.onCreate(savedInstanceState);  
  55.         setContentView(R.layout.main);  
  56.           
  57.         mTextView = (TextView)findViewById(R.id.textview);  
  58.         mButton = (Button)findViewById(R.id.button);  
  59.           
  60.         mButton.setOnClickListener(new OnClickListener() {  
  61.               
  62.             @Override  
  63.             public void onClick(View v) {  
  64.                 // TODO Auto-generated method stub  
  65.                 Intent service = new Intent("com.jackchan.aidlserver.IAIDLServerService");  
  66.                 bindService(service, mConnection, BIND_AUTO_CREATE);  
  67.             }  
  68.         });  
  69.     }  
  70.   
  71.     @Override  
  72.     public boolean onCreateOptionsMenu(Menu menu) {  
  73.         getMenuInflater().inflate(R.menu.main, menu);  
  74.         return true;  
  75.     }  
  76. }  

其中布局文件代码如下:


  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"   
  5.     android:orientation="vertical">  
  6.   
  7.     <TextView      
  8.         android:id="@+id/textview"    
  9.         android:layout_width="fill_parent"     
  10.         android:layout_height="wrap_content"     
  11.         android:text="@string/hello_world"    
  12.         />    
  13.     <Button    
  14.         android:id="@+id/button"    
  15.         android:layout_width="fill_parent"    
  16.         android:layout_height="wrap_content"    
  17.         android:text="调用AIDL服务"    
  18.         />  
  19.   
  20. </LinearLayout>  


最后客户端效果图如下:





  1. <pre></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4. <pre></pre>  
  5. <pre></pre>  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
AIDL的接触和使用
4.2.3 Service精通
Android 中的AIDL
使用AIDL(Android接口描述语言)设计和使用远程接口
使用AIDL实现进程间的通信之复杂类型传递
Android 内核--Binder架构分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服