1.AIDL概念

  在Android系统中,个个应用程序都运行在自己的进程中,进程之间一般是无法直接进行数据交换的, 而为了实现跨进程,Android给我们提供了所谓的Binder机制,而这个机制使用的接口语言就是: AIDL(Android Interface Definition Language),通过定义了进程间的通信接口来实现进程间的通信.

2.AIDL实现

1.服务端

1.首先在服务端创建aidl目录

手动创建目录以及包:

切换到Project目录下,在main目录下点击创建新目录,注意aidl要与java文件夹同级.

自动创建aidl文件夹以及包:

在File--New--AIDL--AIDL File下进行创建aidl目录及其文件

2.在目录下创建aidl文件

  这里其实就是定义一个接口,在其中定义需要的方法,并make project,此时会在build--generated--aidl_source_output_dir--debug--compileDebugAidl--out下生成一个文件

在这个类中,我们主要关注的是我们自定义的play()方法和pause()方法以及asInterface,asInterface主要用于客户端获取服务端的ibinder对象时需要用到.

注意:接口和方法前面不要加访问权限修饰符:public ,private,protected等,也不能用static final!

// MusicControlInterface.aidlpackage com.example.aidltestmusicservice;// Declare any non-default types here with import statementsinterface MusicControlInterface {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    void play();    void pause();}

3.自定义Service类,在其中对接口进行实现

1.继承Service类,同时定义一个MusicBinder类对MusicControlInterface.Stub接口进行实现

2.在Serivce中进行实现onBind方法,并在其中返回已经实现的MusicBinder类

MusicControlManager:

public class MusicControlManager extends Service {    private MediaPlayer mediaPlayer;    public MusicControlManager() {    }    @Override    public IBinder onBind(Intent intent) {       return new MusicBinder();    }    @Override    public void onCreate() {        super.onCreate();        mediaPlayer=MediaPlayer.create(this,R.raw.wind);    }    public void start(){        mediaPlayer.start();    }    public void stop(){        mediaPlayer.pause();    }    public class MusicBinder extends com.example.aidltestmusicservice.MusicControlInterface.Stub {        @Override        public void play() throws RemoteException {            start();            Log.d("start","starting....");        }        @Override        public void pause() throws RemoteException {            stop();            Log.d("pause","pauseing...");        }    }}

我这里是对mediaPlayer进行操作的两个方法,分别是开始和暂停.

4.在AndroidManifest.xml中进行配置

主要是配置enabled以及exported为true,可以被外部访问到,exported为true表示可以被其他应用隐式调用,enabled为true表示能够被系统实例化.

这里服务端就配置完成,接下来看客户端

2.客户端

1.首先将服务端的aidl文件全部拷贝过来,注意位置以及包名都不用改

2.在MainActivity中进行绑定Service

1.自定义MyServiceConnected类实现ServiceConnected

2.将MyServiceConnected的对象传入bindService中进行绑定服务

3.通过asInterface方法将传过来的对象赋值到定义的myBinder中

public class MainActivity extends AppCompatActivity {    private Button start_bt,stop_bt;    private MusicControlInterface myBinder;    private MyServiceConnected myServiceConnected;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Intent intent=new Intent();        myServiceConnected=new MyServiceConnected();        intent.setClassName("com.example.aidltestmusicservice","com.example.aidltestmusicservice.MusicControlManager");        bindService(intent,myServiceConnected, Context.BIND_AUTO_CREATE);        start_bt=findViewById(R.id.button);        start_bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                try {                    myBinder.play();                } catch (RemoteException e) {                    e.printStackTrace();                }            }        });        stop_bt=findViewById(R.id.button2);        stop_bt.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                try {                    myBinder.pause();                } catch (RemoteException e) {                    e.printStackTrace();                }            }        });    }    public class MyServiceConnected implements ServiceConnection{        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            myBinder= (MusicControlInterface) MusicControlInterface.Stub.asInterface(iBinder);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {        }    }    @Override    protected void onDestroy() {        super.onDestroy();        unbindService(myServiceConnected);    }}

  定义了一个myBinder的对象,通过onServiceConnected方法将传过来的iBinder转换为aidl中定义的接口,在客户端中通过myBinder对象调用对应的方法,如我这里的播放和暂停的操作.

总结

实现aidl的基本步骤

1.在服务端创建aidl文件夹以及aidl文件

2.在aidl文件中定义需要实现的方法

3.自定义Service类,在其中实现Stub接口中的方法,并在onBind方法中进行返回

4.在AndroidManifest.xml注册Service,并配置属性enabled和exported

5.将aidl文件拷贝到客户端对应的位置,与java文件夹同级

6.自定义MyServiceConnected类实现ServiceConnected

7.将MyServiceConnected的对象传入bindService中进行绑定服务

8.通过asInterface方法将传过来的对象赋值到定义的myBinder中

注意事项

1.注意在AndroidMainfest.xml配置注册Service的enabled和exported的属性

2.两个app里的aidl必须在同一个包下,包名需一致

3.在bindService时需要指定另一个APP的包,可利用setPackage方法进行设置

更多相关文章

  1. Android之Service总结
  2. 在android中的ndk打印日志
  3. Android的异步加载
  4. Android的Parcelable用法
  5. android自定义checkBox的样式
  6. Android(安卓)SharedPreferences用法及程序共享机制
  7. TextView使用android:autoLink="web"但又不打算跳转外部浏览器
  8. Android中自定义ListView无法响应OnItemClickListener中的onItem
  9. [Android] Android应用插件式开发解决方法

随机推荐

  1. 数字孪生城市“大脑”的技术融合与发展Th
  2. uni-app页面生命与vue生命周期
  3. Solidwork软件(license)许可证竟然还可以这
  4. [MAC] 小技巧– 有边打边,轻松打出不会念
  5. dget: Command not found
  6. Golang 之SSH理解
  7. 身份验证会影响用户体验吗?
  8. 在苹果Mac上的Safari浏览器中如何阻止跨
  9. 如何快速给图片添加水印?
  10. shell变量的删除、替换和替代