美文网首页
使用bindService完成IPC进程间通信(在同一个APP内

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

作者: Jowney | 来源:发表于2018-08-23 18:56 被阅读9次

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

    相关文章

      网友评论

          本文标题:使用bindService完成IPC进程间通信(在同一个APP内

          本文链接:https://www.haomeiwen.com/subject/qpemiftx.html