Android AIDL服务学习笔记

Android支持两种类型的服务:本地服务与远程服务。本地服务只能供承载它的应用程序使用,而远程服务还可以供其它应用程序使用。在Android中,远程服务可以使用AIDL(Android Interface Definition Language)向客户端定义自身。

下面说明创建AIDL服务的步骤:

  1. 编写一个AIDL文件(以.aidl为后缀)来向客户端定义接口,AIDL文件使用java语法。
  2. 将此AIDL文件添加到eclipse项目的src目录下。ADT将会调用AIDL编译器自动生成一个java接口,此文件位于gen目录下,可以打开查看。
  3. 实现一个服务并从onBind()方法中返回生成的接口(一般我们在服务中实现这个接口,然后在onBind()方法中返回其实例)。
  4. 在Manifest中配置Service,这里我们必须要使用intent-filter,并为其添加action属性。

废话不说,上代码(很简单的代码):
        项目结构

  

Person.aidl(注意:接口不能有修饰符)
[java]  view plain copy
  1. package kevin.demo;  
  2.   
  3. interface Person {  
  4.     int getAge(String name);  
  5. }<strong>  
  6. </strong>  

RemoteServcie
[java]  view plain copy
  1. package kevin.demo;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.os.RemoteException;  
  7.   
  8. public class RemoteService extends Service {  
  9.     public static final String REMOTE_SERVICE_ACTION = "kevin.demo.action.remote";  
  10.   
  11.     @Override  
  12.     public void onCreate() {  
  13.         // TODO Auto-generated method stub  
  14.         super.onCreate();  
  15.         System.out.println("service created..");  
  16.     }  
  17.   
  18.     @Override  
  19.     public IBinder onBind(Intent intent) {  
  20.         // TODO Auto-generated method stub  
  21.         System.out.println("Service bound..");  
  22.         // 返回远程服务的实例  
  23.         return new PersonIml();  
  24.     }  
  25.   
  26.     @Override  
  27.     public boolean onUnbind(Intent intent) {  
  28.         // TODO Auto-generated method stub  
  29.         System.out.println("service unbound");  
  30.         return super.onUnbind(intent);  
  31.     }  
  32.   
  33.     @Override  
  34.     public void onStart(Intent intent, int startId) {  
  35.         // TODO Auto-generated method stub  
  36.         super.onStart(intent, startId);  
  37.         System.out.println("Service started..");  
  38.     }  
  39.   
  40.     // 远程服务的实现  
  41.     private class PersonIml extends Person.Stub {  
  42.   
  43.         @Override  
  44.         public int getAge(String name) throws RemoteException {  
  45.             if (name.equals("kevin")) {  
  46.                 return 22;  
  47.             }  
  48.             return -1;  
  49.         }  
  50.   
  51.     }  
  52. }<strong>  
  53. </strong>  

Android Manifest
[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="kevin.demo" android:versionCode="1" android:versionName="1.0">  
  4.   
  5.   
  6.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  7.         <service android:name="RemoteService">  
  8.             <intent-filter>  
  9.                 <action android:name="kevin.demo.action.remote"></action>  
  10.             </intent-filter>  
  11.         </service>  
  12.   
  13.   
  14.     </application>  
  15. </manifest>  

接下来我们实现客户端的项目,通过此项目我们可以访问刚才定义的远程服务。这里我们必须把在远程服务项目中定义 的AIDL接口复制到此项目中,并且要保证包名与远程项目中此接口文件所在包名相同,并且此包中的Activity不能和此文件同包。下面是项目结构与代码:

Person.aidl同上

RemoteClient.java
[java]  view plain copy
  1.   
[java]  view plain copy
  1. package kevin.client;  
  2.   
  3. import kevin.demo.Person;  
  4. import android.app.Activity;  
  5. import android.content.ComponentName;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. import android.os.RemoteException;  
  11. import android.widget.Toast;  
  12.   
  13. public class RemoteClient extends Activity {  
  14.     /** Called when the activity is first created. */  
  15.     private static final String TAG = "RemoteClient";  
  16.   
  17.     @Override  
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21.     }  
  22.   
  23.     @Override  
  24.     protected void onStart() {  
  25.         // TODO Auto-generated method stub  
  26.         super.onStart();  
  27.         System.out.println(TAG + " onStart..");  
  28.         bindService(new Intent("kevin.demo.action.remote"), conn,  
  29.                 BIND_AUTO_CREATE);  
  30.         System.out.println(TAG + "bindService invoked..");  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onStop() {  
  35.         // TODO Auto-generated method stub  
  36.         super.onStop();  
  37.         unbindService(conn);  
  38.     }  
  39.   
  40.     private ServiceConnection conn = new ServiceConnection() {  
  41.   
  42.         @Override  
  43.         public void onServiceDisconnected(ComponentName name) {  
  44.             // TODO Auto-generated method stub  
  45.             System.out.println("RemoteClient service disconnected..");  
  46.         }  
  47.   
  48.         @Override  
  49.         public void onServiceConnected(ComponentName name, IBinder service) {  
  50.             // TODO Auto-generated method stub  
  51.             System.out.println("RemoteClient servcie connected..");  
  52.             System.out.println("-------------------");  
  53.             Person remoteServ = Person.Stub.asInterface(service);  
  54.             try {  
  55.                 System.out.println("My age is:  " + remoteServ.getAge("kevin"));  
  56.                 Toast.makeText(RemoteClient.this,  
  57.                         "My age is:  " + remoteServ.getAge("kevin"),  
  58.                         Toast.LENGTH_LONG).show();  
  59.             } catch (RemoteException e) {  
  60.                 // TODO Auto-generated catch block  
  61.                 e.printStackTrace();  
  62.             }  
  63.             System.out.println("-------------------");  
  64.         }  
  65.     };  
  66. }  

下面是LogCat中的结果



这就是一个简单的AIDL服务创建与使用的过程 ,希望能帮到大家 。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序邦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值