Android AIDL 使用详解

远程Service与Activity的交互(AIDL的应用)

首先我们先上一个通俗的情景:在应用1中Activity绑定了一个Service,并且设置了一些值,此时我们想在应用2中调用该service并且想得到该值应该怎么做?我们都知道每个应用程序都运行在各自的进程中,并且Android平台是不允许不同进程间进行直接的对象数据等传递的。如果必须进行跨进程之间的数据传递,那么我们就应该使用AIDL(Android Interface Definition Language)。

AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符;AIDL运行方法有任何类型的参数和返回值,在Java的类型中,以下的类型使用时不需要导入包(import),基本数据类型、String、Map、List.当然为了避免出错,建议只要使用了,就导入包。

使用AIDL的步骤:

服务端(提供服务):

第1步:定义一个*.aidl文件,该文件里是符合aidl语言规范的接口定义,里面定义了外部应用可以访问的方法。当我们保存该文件的时候,eclipse会自动为我们在gen文件夹下生成一个相应的java接口文件。如:

 package com.android.macdroid;  
    interface IPerson {   
        void setValue(String name);  
        String getValue();   
 }  
第2步: 实现AIDL文件生成的JAVA接口Stub
class Person extends IPerson.Stub {  
    private String name;  
     
    @Override  
    public void setValue(String name) throws RemoteException {  
       this.name = name ;  
    }  
  
    @Override  
    public String getValue() throws RemoteException {  
        return name;  
    }  
      
} 
第3步: 定义一个自己的service,并将其注册到androidManifest.xml文件中,例如:
    public class ServiceC extends Service {    
        private Stub iPerson = new Person();    
        @Override    
        public IBinder onBind(Intent arg0) {    
            Log.i("service", "onBind...");    
            return iPerson;    
        }    
    }   
<service android:name="com.android.macdroid.ServiceC" >  
           <intent-filter >  
               <action android:name="forServiceAidl" > </action>  
           </intent-filter>  
       </service> 
  我们都知道,在实现自己的service时,为了其他应用可以通过bindService来和我们的service进行交互,我们都要实现service中的onBind()方法,并且返回一个继承了Binder的内部类;在这里,eclipse自动为我们生成的RemoteServiceInterface.java中有一个实现了Binder的内部类,RemoteServiceInterface.Stub。AIDL要求我们,在这里不能再直接去实现Binder类了,而是去实现,AIDL提供给我们的Stub类。 实现stub类的同时,AIDL还要求我们同时实现我们在接口中定义的各种服务的具体实现。至此为止,我们的服务端已经和我们的aidl文件绑定到一起了哦。

同一个应用中的Activity为该Service中赋值:

    package com.android.macdroid;  
      
    import android.app.Activity;  
    import android.app.Service;  
    import android.content.ComponentName;  
    import android.content.DialogInterface;  
    import android.view.View;  
    import android.view.View.OnClickListener;  
    import android.content.Intent;  
    import android.content.ServiceConnection;  
    import android.os.Bundle;  
    import android.os.IBinder;  
    import android.os.RemoteException;  
    import android.widget.Button;  
    import android.widget.Toast;  
    import com.android.macdroid.IPerson;  
      
    public class AIDLTestActivity extends Activity  {  
      
        private IPerson iPerson;  
        private Button bindBtn, unbindBtn;   
      
        private ServiceConnection conn = new ServiceConnection() {  
      
            // 断开连接时调用  
            @Override  
            public void onServiceDisconnected(ComponentName arg0) {  
            }  
      
            // 连接时调用  
            @Override  
            public void onServiceConnected(ComponentName arg0, IBinder binder) {  
                iPerson = IPerson.Stub.asInterface(binder);  
                if (iPerson != null) {  
                    try {  
                        iPerson.setValue("Service AIDL");  
                        Toast.makeText(AIDLTestActivity.this, "赋值成功!",  
                                Toast.LENGTH_LONG).show();  
                    } catch (RemoteException e) {  
                        e.printStackTrace();  
                        Toast.makeText(AIDLTestActivity.this, "赋值失败!",  
                                Toast.LENGTH_LONG).show();  
                    }  
                }  
            }  
        };  
      
        @Override  
        public void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);  
            setContentView(R.layout.main);  
            bindBtn = (Button) findViewById(R.id.bindBtn);  
            unbindBtn = (Button) findViewById(R.id.unbindBtn);  
            bindBtn.setOnClickListener((android.view.View.OnClickListener) listener);  
            bindBtn.setOnClickListener(listener);  
            unbindBtn.setOnClickListener(listener);  
        }  
        private OnClickListener listener = new OnClickListener() {    
      
            @Override  
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                  switch (v.getId()) {    
                    case R.id.bindBtn:    
                        //本应用中需要在manifest中配置RemoteService    
                        bindService(new Intent("forServiceAidl"), conn, Service.BIND_AUTO_CREATE);    
                        break;    
                    case R.id.unbindBtn:    
                        unbindService(conn);    
                        break;    
                    default:    
                        break;    
                    }    
            }  
      
        };   
      
    }  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值