背景

AIDL跨进程通信,又叫做Android 接口定义语言,能让两个Android进程进行通讯的语言

一、服务端

创建一个aidl文件

package com.example.server;interface IPlayServiceAIDL {    void play();    void stop();}

包名必须是服务端的包名,文件夹的目录如图所示,写好aidl文件后make一下项目就会生成一个IPlayServiceAIDL文件

AIDL跨进程通讯_第1张图片

我们创建一个服务 这个服务提供外部一些功能,比如我们提供一个音乐的播放和暂停的功能

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

更多相关文章

  1. android从raw里面读取txt文件
  2. android直接找一个文件,部分编译等实用
  3. Android 保存文件路径方法
  4. Android引用百度定位API第三方组件后导致其它.so文件无法正常加
  5. Android上传文件之FTP
  6. Android Studio 如何导入.so文件/jar文件和library库
  7. Android 之 ContentProvider 共享数据库-通讯录
  8. Android JNI cpp文件创建 java bean 对象并返回
  9. Android 学习笔记8---SAX和DOM解析XML文件

随机推荐

  1. Android万能框架搭建
  2. Node.js+Koa2+MySQL打造前后端分离精品项
  3. centos crontab设置
  4. [zookeeper]2.zookeeper的常用API
  5. [zookeeper]1.zookeeper是什么?
  6. 随记:安装数据库的时候需要配置YUM(本地+桥
  7. Android(安卓)SDK开发 (三) App的属性配
  8. android从byte[]字节数组中播放mp3音乐
  9. Android(安卓)Bitmap保存为.bmp格式,图像
  10. Android(安卓)save state