Android使用AIDL实现进程间的简单通信
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!
[code]// MusicControlInterface.aidl package com.example.aidltestmusicservice; // Declare any non-default types here with import statements interface 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:
[code]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中进行配置
[code]<service android:name=".MusicControlManager" android:enabled="true" android:exported="true"></service>
主要是配置enabled以及exported为true,可以被外部访问到,exported为true表示可以被其他应用隐式调用,enabled为true表示能够被系统实例化.
这里服务端就配置完成,接下来看客户端
2.客户端
1.首先将服务端的aidl文件全部拷贝过来,注意位置以及包名都不用改
2.在MainActivity中进行绑定Service
1.自定义MyServiceConnected类实现ServiceConnected
2.将MyServiceConnected的对象传入bindService中进行绑定服务
3.通过asInterface方法将传过来的对象赋值到定义的myBinder中
[code]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方法进行设置
- 点赞
- 收藏
- 分享
- 文章举报
- Android基础--使用AIDL实现进程间的通信
- Android基础--使用AIDL实现进程间的通信之复杂类型传递
- Android进程之间的通信Aidl简单介绍和使用步骤
- Android例子—AIDL实现两个进程间的简单通信
- 【随心笔录】Android AIDL使用,实现跨进程通信
- Android AIDL使用详解 实现进程间的通信
- Androidk开发入门之使用AIDL实现进程通信
- Android中AIDL使用 及 AIDL实现进程间的通信
- Android 使用AIDL实现进程之间的通信(一)
- android使用AIDL实现进程间的通信
- Android 使用Messenger和Aidl实现跨进程通信
- Android开发之使用AIDL和远程服务实现进程通信
- Android 使用AIDL实现进程间的通信
- Android 使用AIDL实现进程间的通信
- Android-->IPC(跨进程)通信Aidl的实现方法
- 使用AIDL和远程服务实现进程通信
- 【转】使用AIDL实现进程间的通信之复杂类型传递
- 使用AIDL实现进程间的通信
- Android:使用AIDL实现进程间通讯
- 使用AIDL实现进程间的通信