加入收藏 | 设为首页 | 会员中心 | 我要投稿 南通站长网 (https://www.0513zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android的AIDL达成进程间通信

发布时间:2021-11-24 20:21:19 所属栏目:教程 来源:互联网
导读:Android系统使用AIDL(Androidinterface description language )实现进程间的通信,例如一个服务端应用程序和一个客户端运用程序之间进行通信,服务端采用service组件提供后台服务,客户端则可用Activity一些组件供用户进行操作。使用AIDL的步骤: 1. 分别创

Android系统使用AIDL(Androidinterface description language )实现进程间的通信,例如一个服务端应用程序和一个客户端运用程序之间进行通信,服务端采用service组件提供后台服务,客户端则可用Activity一些组件供用户进行操作。使用AIDL的步骤:
 
   1. 分别创建客户端和服务端项目,
 
      注意包名不能相同
 
   2. 在Server项目中,删除Activity类和清单中的配置
 
   3. 在Server项目中,创建类,继承Service,
 
      覆写绑定方式的生命周期方法
 
   4. 创建一个aidl接口,以小写aidl为扩展名
 
                   在接口中定义回调方法,该方法可供客户端访问,实现客户端对服务端的操作。
 
       注意:1. aidl文件中不能出现访问限定符
 
            2. aidl文件在两个项目中要完全一致
 
            3. aidl文件的语法类似于Interface
 
           
 
   5. 把aidl文件复制到客户端项目,注意包名要一致
 
                                        
 
    6. 在Service中,创建一个类,继承aidl生成接口的Stub类,同时实现其抽象方法。
 
       例如: class MyBinderextends IMyService.Stub
 
     
 
  7. 在服务的清单文件中,配置Service的Action
 
               例如:
 
              <service android:name="AIDLService">
 
            <intent-filter >
 
                <action android:name="com.action.ACTION_AIDL"/>
 
            </intent-filter>
 
        </service>
 
     8.. 在Service中的onCreate()方法中
 
         创建Binder的实例,并在onBind()
 
         方法中返回该实例
 
         例如:
 
                @Override
 
                 public void onCreate() {
 
                            super.onCreate();
 
                            mBinder= new MyBinder();
 
                            Log.d("AIDL","Server:onCreate()");
 
                 }
 
        
 
                 @Override
 
                 public IBinder onBind(Intentintent) {
 
                            Log.d("AIDL","Server:onBind()");
 
                            returnmBinder;
 
                 }
 
    9.. 客户端的布局main.xml文件中增加按钮,分别设置监听事件。
 
          并在代码中注册按钮的监听事件
 
  10. 在onserviceConnected()方法中得到aidl接口实例
 
         的方法是:      IMyService binder =IMyService.Stub.asInterface(service);
 
         注意onServiceConnection方法参数中的Ibinder不是IMyService.Stub类型,不能直接向上转型,只能使用方法IMyService.Stub.asInterface(service)获得一个实现了IMyService接口的类型对象,其类型为IMyService.Stub.Proxy。
 
   11. 通过binder调用接口中定义的方法来实现对远程服务的控制
 
 
 
AIDL只支持基本数据类型,以及String,List Map ,接口中定义的方法可带参数,同时可返回结果,非基本数据类型定义方法,包括in,out,inout ,in 指客户端输入,out指服务端输出,对于基本数据类型默认为in。除了这些数据类型,如果想使用自己定义的类型,必须得实现Parcelable接口,同时创建一个相同名称以aidl为扩展的文件,例如自定义Person类型,得有两个文件:Person.java  ,Person.aidl
 
假设包名为com.aidl,则Person.aidl的代码:
 
packagecom.aidl;
 
parcelablePerson;
 
Person.java文件中该类得实现Parcelable接口例如代码为:
 
packagecom.aidl;
 
 
 
importandroid.os.Parcel;
 
importandroid.os.Parcelable;
 
 
 
publicclass Person implements Parcelable{
 
         private int age;
 
         private String name;
 
 
 
         public Person(){
 
         }
 
        
 
         private Person(Parcel in){
 
                   readFromParcel(in);
 
         }
 
        
 
         public void readFromParcel(Parcel in){
 
                   age = in.readInt();
 
                   name = in.readString();
 
         }
 
        
 
         public int getAge() {
 
                   return age;
 
         }
 
 
 
         public void setAge(int age) {
 
                   this.age = age;
 
         }
 
 
 
         public String getName() {
 
                   return name;
 
         }
 
 
 
         public void setName(String name) {
 
                   this.name = name;
 
         }
 
 
 
         @Override
 
         public int describeContents() {
 
                   // TODO Auto-generated methodstub
 
                   return 0;
 
         }
 
 
 
         @Override
 
         public void writeToParcel(Parcel out,int flags) {
 
                   // TODO Auto-generated methodstub
 
                   out.writeInt(age);
 
                   out.writeString(name);
 
         }
 
         public static finalParcelable.Creator<Person> CREATOR = new
 
                                                                                                                Creator<Person>(){
 
                   public Person[] newArray(intsize) {
 
                            return newPerson[size];
 
                   }
 
                   public PersoncreateFromParcel(Parcel in) {
 
                            return newPerson(in);
 
                   }
 
         };
 
}
 
类中得有一个Parcelable.Creator类型的静态常量CREATOR。
 
在接口在要使用自定义的类型得使用import导入,例如定义一个IMyService.aidl文件:
 
package com.aidl;
 
import com.aidl.Person;
 
interface IMyService {
 
   Stringcallback(in List<String> list, inString s ,in Person person);
 
}
 
最后将该包下的文件连同包名拷到客户端程序,实现进程间的通信。

(编辑:南通站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读