aidl(android 接口定义语言)

来源:互联网 发布:淘宝上买电器可靠吗 编辑:程序博客网 时间:2024/03/29 20:21
远程服务:调用者和服务在不同的工程代码里面。本地服务:调用者和服务在同一个工程代码里面。每一个应用程序都是运行在自己独立的进程里面的。进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。aidl:android interface definition language  安卓接口定义语言aidl文件都是公有的,没有访问权限修饰符IPC: inter process communication 进程间通讯绑定本地服务调用方法的步骤:1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法private class MiddlePerson extends Binder implements IMiddlePerson{}2.实现服务的onbind方法,返回的就是中间人 MiddlePerson3.在activity 绑定服务。bindService();4.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象5.强制类型转化 调用接口里面的方法。-------------------------------------------绑定远程服务调用方法的步骤:1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法2.把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 publicprivate class MiddlePerson extends IMiddlePerson.Stub{}  IPC的子类,代理人 必须要实现一个方法,这个方法可以调用于服务的方法3.实现服务的onbind方法,返回的就是中间人 IMiddlePerson4.在activity 绑定服务。bindService();5.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象6.IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。==================绑定远程服务的流程=========================1.在 activity 调用 bindService() 去绑定服务, bindService(inten,new myCon(),BIND_AUTO_CREATE);需要传递一个叫 ServiceConntion的接口参数,用来返回两个回调 当服务被成功绑定, 当服务失去联系2.在服务里面 需要重写方法, onbind() 在服务被绑定的时侯 调用 返回一个 IBinder接口 对象(代理人) 接口定义,需要改成 aidl  用自动生成的IService.stub代理人 必须要实现一个方法,这个方法可以调用到服务的方法3.在activity 的onServiceConneted 得到中间人,使用aidl 自动生成 IService.stub.asInterFace()4.调用中间人的方法5.中间人调用服务的方法
远程的服务:public class RemoteService extends Service {    @Override    public void onCreate() {        System.out.println("远程服务被创建了。。。");        super.onCreate();    }    @Override    public void onDestroy() {        System.out.println("远程服务被销毁了。");        super.onDestroy();    }    @Override    public IBinder onBind(Intent intent) {        return new MiddlePerson();    }    private void methodInService(){        System.out.println("我是远程服务的方法,我被调用了。。。。");    }    //1.创建一个中间人  远程服务继承的是ipc的一个实现类    private class MiddlePerson extends IMiddlePerson.Stub{        @Override        public void callMethodInService() {            methodInService();        }    }}//创建隐士服务: <service android:name="com.itheima.remoteservice.RemoteService">            <intent-filter >                <action android:name="com.itheima.remoteservice"/>            </intent-filter>        </service>
aidl文件package com.itheima.remoteservice; interface IMiddlePerson {    /**     * 调用服务里面的方法     */     void callMethodInService();}
//将远程的包和 aidl文件 复制过来//activity 绑定远程服务public class MainActivity extends Activity {    private MyConn conn;    private IMiddlePerson iMp;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    /**     * 绑定远程服务     * @param view     */    public void bind(View view){        Intent intent = new Intent();        //调用的服务意图        intent.setAction("com.itheima.remoteservice");        conn = new MyConn();        bindService(intent, conn, BIND_AUTO_CREATE);    }    private class MyConn implements ServiceConnection{        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            iMp = IMiddlePerson.Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {        }    }    public void call(View view){        try {            iMp.callMethodInService();        } catch (RemoteException e) {            e.printStackTrace();        }    }    @Override    protected void onDestroy() {        unbindService(conn);        super.onDestroy();    }}
0 0
原创粉丝点击