首页 > 系统 > Android > 正文

Android进程间通信---AIDL

2019-11-07 23:57:16
字体:
来源:转载
供稿:网友

AIDL可以发送基本数据、String、List、Map和实现Parcable接口的对象

一、创建AIDL文件和Service文件,目录结构如下:

二、AIDL文件

// IMyAidlInterface.aidlpackage com.mathias.hb.androidbasicknowledge;// Declare any non-default types here with import statementsinterface IMyAidlInterface {    // 发送基本数据    int plus(int a, int b);    int reduce(int a,int b);    // 发送String    String getString();    // 发送List集合    List getList();}

三、Service文件

package com.mathias.hb.androidbasicknowledge.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import com.mathias.hb.androidbasicknowledge.IMyAidlInterface;import com.mathias.hb.androidbasicknowledge.bean.Student;import java.util.ArrayList;import java.util.List;public class MyAIDLService extends Service {    static int binderId = 0;    List<Integer> list;    String str = "hello world";    Student student = new Student("Mathias","men",25);    public MyAIDLService() {    }    @Override    public void onCreate() {        super.onCreate();        Log.v("MyAidlService","onCreate");                list = new ArrayList();        for (int i = 0;i < 5 ; i++){            list.add(i);        }    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        Log.v("MyAidlService","onStartCommand");        return super.onStartCommand(intent, flags, startId);    }    @Override    public IBinder onBind(Intent intent) throws UnsupportedOperationException{        // TODO: Return the communication channel to the service.        Log.v("MyAidlService","onBind");        return binder;    }    @Override    public void onDestroy() {        super.onDestroy();        Log.v("MyAidlService","onDestory");    }    IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub()    {        @Override        public int plus(int a, int b) throws RemoteException {            return a + b;        }        @Override        public int reduce(int a, int b) throws RemoteException {           return a - b;        }        @Override        public String getString() throws RemoteException {            return str;        }        @Override        public List getList() throws RemoteException {            return list;        }    };}

四、修改Androidmanifest.xml文件

<service android:name=".service.MyAIDLService" android:PRocess=":remote">      <intent-filter>           <action android:name="com.mathias.hb.androidbasicknowledge" />      </intent-filter></service> 此处一定要添加action

五、另一个进程

1、先将上一个进程中的AIDL文件包括完整包拷贝粘贴到aidl目录下

2、启动服务,交互

package com.mathias.hb.androidbasicknowledge;import android.app.Service;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import java.util.List;public class MainActivity extends AppCompatActivity {    private EditText et01;    private EditText et02;    private Intent serviceIntent;    private IMyAidlInterface myAidlService;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et01 = (EditText) findViewById(R.id.et_num01);        et02 = (EditText) findViewById(R.id.et_num02);    }    public void bindService(View view){        serviceIntent = new Intent();        // 要启动的Service在AndroidManifest.xml文件中设置的action        serviceIntent.setAction("com.mathias.hb.androidbasicknowledge");        // 注意:在Android 5.0以后,启动另一个应用的Service时需要添加一下方法表示启动那个引用中的service        serviceIntent.setPackage("com.mathias.hb.androidbasicknowledge");        startService(serviceIntent);        bindService(serviceIntent,serviceConnection , Service.BIND_AUTO_CREATE);    }    public void unbindService(View view){        unbindService(serviceConnection);        stopService(serviceIntent);    }    ServiceConnection serviceConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            /**             * 需要在gradle文件中添加一下代码才能找到这个类             * sourceSets{             *      main{             *          java.srcDirs = ['src/main/java','src/main/aidl']             *      }             * }             */            Log.i("MyAidlService", "连接Service 成功");            myAidlService = IMyAidlInterface.Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    };    public void plus(View view){        int a = Integer.parseInt(et01.getText().toString());        int b = Integer.parseInt(et02.getText().toString());        try {            int num01 = myAidlService.plus(a,b);            Log.v("a + b = ",num01 +"");        } catch (RemoteException e) {            e.printStackTrace();        }    }    public void reduce(View view){        int a = Integer.parseInt(et01.getText().toString());        int b = Integer.parseInt(et02.getText().toString());        int num02 = 0;        try {            num02 = myAidlService.reduce(a,b);            Log.v("a - b = ",num02 +"");        } catch (RemoteException e) {            e.printStackTrace();        }    }    public void getListData(View view){        try {            List list =  myAidlService.getList();            for (int i = 0; i < list.size();i++){                Log.v("listData",i + "");            }        } catch (RemoteException e) {            e.printStackTrace();        }    }    public void getString(View view){        try {            Log.v("StringData", myAidlService.getString());        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(serviceConnection);        stopService(serviceIntent);    }}六、发送一个自定义对象

自定义类需要实现Parcelable接口,并且在相同的包下创建aidl文件

package com.mathias.hb.androidbasicknowledge.bean;import android.os.Parcel;import android.os.Parcelable;/** * Created by HB on 2017/2/24. */public class Student implements Parcelable{    String name;    String gender;    int age;    public Student(String name,String gender,int age){       this.name = name;       this.gender = gender;       this.age = age;    }    protected Student(Parcel in) {        name = in.readString();        gender = in.readString();        age = in.readInt();    }    public static final Creator<Student> CREATOR = new Creator<Student>() {        @Override        public Student createFromParcel(Parcel in) {            return new Student(in);        }        @Override        public Student[] newArray(int size) {            return new Student[size];        }    };    @Override    public int describeContents() {        return 0;    }    @Override    public void writeToParcel(Parcel dest, int flags) {        dest.writeString(name);        dest.writeString(gender);        dest.writeInt(age);    }    public String getName() {        return name;    }    public String getGender() {        return gender;    }    public int getAge() {        return age;    }    public void setName(String name) {        this.name = name;    }    public void setGender(String gender) {        this.gender = gender;    }    public void setAge(int age) {        this.age = age;    }}

 目录结构

Student.aidl文件内容

// Student.aidlpackage com.mathias.hb.androidbasicknowledge;// Declare any non-default types here with import statementsimport com.mathias.hb.androidbasicknowledge.bean.Student;interface Student {    Student getStudent();}剩下步骤与发送String、基本类型、List、Map类型数据相同


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表