android-AIDL

跨进程访问(AIDL服务)
  Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行 数据通信。我们知道4个Android应用程序组件中的3个(Activity、Broadcast和Content Provider)都可以进行跨进程访问,另外一个Android应用程序组件Service同样可以。这就是本节要介绍的AIDL服务。
什么是AIDL服务
为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。因此,可以将这种可以跨进程访问的服务称为AIDL(Android Interface Definition Language)服务
 
A程序
在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件
 
package cn.roco.aidl;
interface StudentQuery {

      String queryStudent( int  number);
}
编写服务
public class StudentQueryService extends Service {
     private IBinder binder = new StudentQueryBinder();
     private String names[]={ "张飞","李静" ,"赵薇" };
     private String query ( int number){
            if(number>0 && number<4){
                 return names[number-1];
           }
            return null;
           
     }

     @Override
     public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return binder;
     }
     /**
      * 关闭服务的时候,释放资源
      */
     @Override
     public void onDestroy() {
            for ( int i = 0; i < names. length; i++) {
                 names[i] = null;
           }
     }
     private final class StudentQueryBinder extends cn.roco.aidl.StudentQuery.Stub {

            @Override
            public String queryStudent( int no) throws RemoteException {
                
                 // TODO Auto-generated method stub
                 return query(no);
           }
     }
}
注册服务
             <service android:name =".StudentQueryService" >
                   <intent-filter >
                         <action android:name= "cn.roco.remote.service.student.query" />
                   </intent-filter >
             </service >
B程序
讲A 程序的AIDL 文件拷贝过来
     private StudentConnection conn= new StudentConnection();
     private StudentQuery studentQuery= null;
     private class StudentConnection implements ServiceConnection{

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                 // TODO Auto-generated method stub
                 studentQuery=StudentQuery.Stub. asInterface(service);
           }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                 // TODO Auto-generated method stub
                
           }
           
     }
Intent intent = new Intent("cn.roco.remote.service.student.query");
bindService(intent, conn, BIND_AUTO_CREATE);
String name = studentQuery.queryStudent(1);

 


调用方法
String name =   studentQuery .queryStudent(1);
 

转载于:https://www.cnblogs.com/it-studio/p/3461170.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值