zoukankan      html  css  js  c++  java
  • AIDL

    在Android平台,一个进程通常不能访问另一个进程的内存空间。但是android提供了AIDL可以用来进程间数据传递。

         AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。
        AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。

    1.创建.aidl文件

    package lyz.com.aidl;
    import lyz.com.aidl.Person;
    interface IMyService{
      void savePersonInfo(in Person person);
      List<Person> getAllPerson();
      String sayHello();
    }

    2.创建一个Person.aidl文件,注意这里是小写

    package lyz.com.aidl;
    parcelable Person;

    3. 因为这里用到了Peson对象,所以要创建一个Person类。Person类,是一个序列化的类,这里使用Parcelable 接口来序列化,是Android提供的一个比Serializable 效率更高的序列化类。

    package lyz.com.aidl;

    import android.os.Parcel;
    import android.os.Parcelable;

    public class Person implements Parcelable{
    private String name;
    private String telNum;
    private int age;
    public String getTelNum() {
    return telNum;
    }

    public void setTelNum(String telNum) {
    this.telNum = telNum;
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    public int getAge() {
    return age;
    }

    public void setAge(int age) {
    this.age = age;
    }

    public Person(){

    }
    public Person(Parcel p){
    name=p.readString();
    telNum=p.readString();
    age=p.readInt();
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
    // TODO Auto-generated method stub
    dest.writeString(name);
    dest.writeString(telNum);
    dest.writeInt(age);
    }

    public static final Parcelable.Creator<Person> CREATOR=new Parcelable.Creator<Person>() {

    @Override
    public Person createFromParcel(Parcel source) {
    // TODO Auto-generated method stub
    return new Person(source);
    }

    @Override
    public Person[] newArray(int size) {
    // TODO Auto-generated method stub
    return new Person[size];
    }

    };
    @Override
    public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
    }
    }

    4.上面的IMyService.aidl保存以后会在gen的相应目录下启动生成IMyService.java文件

    5.我们就可以实现service里面的方法

    package lyz.com.aidl;

    import java.util.LinkedList;
    import java.util.List;

    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.os.RemoteException;

    public class RemoteService extends Service{
    private LinkedList<Person> personList=new LinkedList<Person>();

    private final IMyService.Stub mbinder=new IMyService.Stub() {

    @Override
    public String sayHello() throws RemoteException {
      return "欢迎你通过AIDL访问服务器端";
    }

    @Override
    public void savePersonInfo(Person person) throws RemoteException {
      if(person!=null){
        personList.add(person);
      }
    }

    @Override
    public List<Person> getAllPerson() throws RemoteException {
      return personList;
      }
    };
    @Override
    public IBinder onBind(Intent intent) {
      return mbinder;
      }
    }

    至此服务端代码完成。客户端步骤如下:

     首先建立一个项目,把服务端的包和类一起拷贝到客户端项目中。因为客户端要和服务端通信,必须要使用同一个aidl。

     然后构造客户端的activity类,代码如下:

    public class DemoAIDLActivity extends Activity {
    private TextView tv;
    private Button btsave,btget;
    private IMyService myservice;
    private static Boolean mIsRemoteBound=false;

    private ServiceConnection conn=new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
    myservice=null;
    }
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    myservice=IMyService.Stub.asInterface(service);
    try {
    tv.setText(myservice.sayHello());
    } catch (RemoteException e) {
    e.printStackTrace();
    }

    }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv=(TextView) this.findViewById(R.id.tvshow);
    btsave=(Button) findViewById(R.id.btsave);
    btget=(Button) findViewById(R.id.btget);
    if(mIsRemoteBound){
    unbindService(conn);
    }else{
    Intent intent=new Intent("lyz.com.aidl.RemoteService");
    bindService(intent, conn, BIND_AUTO_CREATE);
    }
    mIsRemoteBound=!mIsRemoteBound;
    btsave.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    Person p=new Person();
    p.setName("lyz");
    p.setAge(22);
    p.setTelNum("123456");
    try {
    myservice.savePersonInfo(p);
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    }
    });
    btget.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    List<Person> list=null;
    try {
    list=myservice.getAllPerson();
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    if(list!=null){
    StringBuilder text=new StringBuilder();
    for(Person p:list){
    text.append("姓名:"+p.getName()+"\n年龄:"+p.getAge()+"\n电话:"+p.getTelNum());
    }
    btget.setText(text);
    }else{
    Toast.makeText(DemoAIDLActivity.this, "得到数据出错", Toast.LENGTH_LONG).show();
    }
    }
    });
    }
    }

    最后,不要忘记注册Service:

    <service android:name=".RemoteService">
    <intent-filter >
    <action android:name="lyz.com.aidl.RemoteService"/>
    </intent-filter>
    </service>

     

     

     

     

     

  • 相关阅读:
    理解MVC MVVM MVP设计模式
    跨域问题详解
    JWT认证
    Django缓存
    API文档自动生成
    DRF分页器
    DRF请求和响应,以及Response对象重新封装
    drf认证、权限、频率、过滤、排序、异常处理
    drf之视图组件以及自动化路由
    【python面向对象实战练习】植物大战僵尸
  • 原文地址:https://www.cnblogs.com/lyz459/p/2586546.html
Copyright © 2011-2022 走看看