使用bindService完成IPC进程间通信(在同一个APP内

2018-08-23  本文已影响9人  Jowney

AIDL从创建到使用:

1、本文假设你已经知道

  • bindService创建流程
  • 如何创建一个子进程
  • AIDL是什么
  • 序列化对象

2、假设这样的场景:在同一个应用的子进程中Service负责数据库(里面有一个Student表,表里有年龄、姓名两个字段)的操作,父进程的Activity该如何添加、修改、删除、查找数据。如何实现?

  • 第一步 创建Student类文件
public class Student implements Parcelable {
    String name;
    int age;

    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;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeInt(this.age);
    }

    public Student() {
    }

    protected Student(Parcel in) {
        this.name = in.readString();
        this.age = in.readInt();
    }

    public static final Creator<Student> CREATOR = new Creator<Student>() {
        @Override
        public Student createFromParcel(Parcel source) {
            return new Student(source);
        }

        @Override
        public Student[] newArray(int size) {
            return new Student[size];
        }
    };
}

  • 第二步
    创建实体类Student的AIDL文件



    编译器自动生成一个aidl文件夹,并根据你刚才在java文件夹下创建aidl文件的路径,生成一个相同的路径来保存该aidl文件。
    打开Student.aidl文件,如图声明该实体类。


  • 第三步
    创建IStudentManager.aidl文件,该文件里面主要是声明方法,如下图
    注意里面用到了Student实体类,需要手动导包。
  • 第四步
    编译项目,然后在如下图的路径中生成了 IStudentManager.java这个接口文件。
    这个文件就是实现IPC的关键
  • 第五步
    在Service中实现 IStudentManager.Sub


public class MyNewBinderService extends Service {
    private static final String TAG = "MyNewBinderService";

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new IStudentManager.Stub() {
            @Override
            public void setStudent(String name, int age) throws RemoteException {
                Log.i(TAG, "setStudent: name:"+name+" age:"+age);
            }

            @Override
            public Student getStudent() throws RemoteException {
                return new Student();
            }
        };
    }

}

第六步
在Activity中绑定该Service

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    IStudentManager myBinder;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent = new Intent(this,MyNewBinderService.class);

        bindService(intent,new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                myBinder = IStudentManager.Stub.asInterface(service) ;
                try {
                    myBinder.setStudent("JJ",24);
                    Log.i(TAG, "onServiceConnected: name:" +   myBinder.getStudent().getName()+"age:"+   myBinder.getStudent().getAge());

                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        },BIND_AUTO_CREATE);

    }

    @Override
    protected void onResume() {
        super.onResume();
    }


}
上一篇下一篇

猜你喜欢

热点阅读