AIDL跨进程通讯
16lz
2021-01-23
背景
AIDL跨进程通信,又叫做Android 接口定义语言,能让两个Android进程进行通讯的语言
一、服务端
创建一个aidl文件
package com.example.server;interface IPlayServiceAIDL { void play(); void stop();}
包名必须是服务端的包名,文件夹的目录如图所示,写好aidl文件后make一下项目就会生成一个IPlayServiceAIDL文件
我们创建一个服务 这个服务提供外部一些功能,比如我们提供一个音乐的播放和暂停的功能
public class PlayService extends Service { private MediaPlayer mediaPlayer; private IBinder mBinder = new IPlayServiceAIDL.Stub() { @Override public void play() { mediaPlayer.start(); } @Override public void stop() { mediaPlayer.stop(); } }; public PlayService() { } @Override public IBinder onBind(Intent intent) { mediaPlayer = new MediaPlayer(); //音频初始化 return mBinder; }}
这里因为我们主要是讲解aidl所以就不细写音频和视频相关的代码了,主要是先开启服务,然后通过Stub获取其他进程的调用,最后调用音频的api,达到跨进程通讯的目的
对于AndroidManifest.xml 文件需要配置以下信息
二、客户端
先把服务端的aidl文件全部靠过来 然后make project生成一个IPlayServiceAIDL文件
通过一个 ServiceConnection 拿到mBinder
private ServiceConnection mConncet = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = IPlayServiceAIDL.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mBinder = null; } };
在onResume的时候连接上服务,在onPause的时候断掉服务,我们就可以通过mBinder进行跨进程通讯
@Override protected void onResume() { super.onResume(); Intent service = new Intent(ACTION); bindService(service, mConncet, Context.BIND_AUTO_CREATE); } @Override protected void onPause() { super.onPause(); unbindService(mConncet); }
我们来看一下客户端全部的代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private static final String ACTION = "com.example.server.PlayService"; private Button btnStart, btnStop; private IPlayServiceAIDL mBinder; private ServiceConnection mConncet = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mBinder = IPlayServiceAIDL.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mBinder = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } @Override protected void onResume() { super.onResume(); Intent service = new Intent(ACTION); bindService(service, mConncet, Context.BIND_AUTO_CREATE); } @Override protected void onPause() { super.onPause(); unbindService(mConncet); } private void initView() { btnStart = (Button) findViewById(R.id.btn_start); btnStop = (Button) findViewById(R.id.btn_stop); btnStart.setOnClickListener(this); btnStop.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_start: try { mBinder.play(); } catch (RemoteException e) { e.printStackTrace(); } break; case R.id.btn_stop: try { mBinder.stop(); } catch (RemoteException e) { e.printStackTrace(); } break; } }}
更多相关文章
- android从raw里面读取txt文件
- android直接找一个文件,部分编译等实用
- Android 保存文件路径方法
- Android引用百度定位API第三方组件后导致其它.so文件无法正常加
- Android上传文件之FTP
- Android Studio 如何导入.so文件/jar文件和library库
- Android 之 ContentProvider 共享数据库-通讯录
- Android JNI cpp文件创建 java bean 对象并返回
- Android 学习笔记8---SAX和DOM解析XML文件