请选择 进入手机版 | 继续访问电脑版

Android 跨进程通信AIDL

[复制链接]
阿峻 发表于 2021-1-2 17:53:05 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
本文仅用于记载开辟过程中遇到的问题及对应的管理方案,如有侵权可立刻删除,同时欢迎各人品评与指正!!!

AIDL(Android Interface Definition Language,Android接口界说语言):用于某个远程的Service可以与多个进程举行通信,实现多个进程共享同一个Service的功能。

在多进程举行通信时,存在两种进程脚色,服务器端和客户端。
服务器端:



  • 新建AIDL文件夹,界说一个IMyAidlInterfaceaidl,在文件中声明该Service向客户端提供哪些接口;创建完要记得rebuild project
  1.         package com.example.test;    import com.example.test.ICallBack;        interface IMyAidlInterface {     void registerCallBack(ICallBack callback);     void unregisterCallBack(ICallBack callback);        }
复制代码

  • 在界说一个ICallBack.aidl,在该文件中声明用于回调的方法;
  1. interface ICallBack {    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */     void Play();     void Pause();     void Next();     ...     }
复制代码

  • 在Service中实现AIDL中界说的所有接口方法;
  1. package com.example.test;        public class AidlService extends Service {            private final String TAG = "AidlService";            @Override            public IBinder onBind(Intent intent) {                return mBinder;            }            private IBinder mBinder = new IMyAidlInterface.Stub() {                @Override                public void registerCallBack(ICallBack callback) throws RemoteException {                    Log.d(TAG, "registerCallBack: ");                    callback.play();                }                @Override                public void unregisterCallBack(ICallBack callback) throws RemoteException {                    Log.d(TAG, "unregisterCallBack: ");                    callback.pause();                }            };        }
复制代码
客户端:



  • 将服务器端的AIDL文件拷贝到客户端的相同目次下;
  • 通过bindService()绑定远程Service
  1.         private void bind() {        Intent intent = new Intent();        intent.setComponent(new ComponentName("com.example.test", "com.example.test.AidlService"));        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);    }
复制代码

  • 通过Service端的onBind()返回IMyAidlInterface.Stub对象实例,就可以用myAidlInterface 调用接口里的方法;
  1.      private ServiceConnection mConnection = new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            Log.d(TAG, "onServiceConnected :success");            myAidlInterface = IMyAidlInterface.Stub.asInterface(service);        }        @Override        public void onServiceDisconnected(ComponentName name) {            Log.d(TAG, "onServiceConnected :failed");            myAidlInterface = null;        }    };  IMyAidlInterface myAidlInterface;  ServiceCallBack mICallBack = new ServiceCallBack();    myAidlInterface.registerCallBack(mICallBack);  myAidlInterface.unregisterCallBack(mICallBack);
复制代码
registerCallBack()、unregisterCallBack()用来注册/解注册回调的对象;

  • 界说ServiceCallBack ,用于吸收注册和接注册回调方法;
  1. //获取AudioManager服务        mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);    mediaPlayer = new MediaPlayer();    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);    //重写ICallBack中方法    //本文为播放音乐的例子        private class ServiceCallBack extends ICallBack.Stub {        @Override        public void play() throws RemoteException {            Log.d(TAG, "回调play");            //请求声音焦点            mAudioManager.requestAudioFocus(new AudioManager.OnAudioFocusChangeListener() {                                                @Override                                                public void onAudioFocusChange(int focusChange) {                                                }                                            },                    AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);            //播放音乐            playMusic();        }        @Override        public void pause() throws RemoteException {            Log.d(TAG, "回调pause");            mediaPlayer.pause();        }        @Override        public void next() throws RemoteException {            Log.d(TAG, "回调next");        }    }        private void playMusic() {        Log.d(TAG, "playMusic");        File file = new File("/mnt/media_rw/udisk2/testMusic/test.mp3");        mediaPlayer.reset();        try {            FileInputStream fileInputStream = new FileInputStream(file);            mediaPlayer.setDataSource(fileInputStream.getFD());            mediaPlayer.prepare();        } catch (IOException e) {            e.printStackTrace();        }        mediaPlayer.start();    }
复制代码
通过FileInputStream 读U盘资源时要记得在AndroidManifest中声明权限


  • 最后清除绑定服务
    @Override
    protected void onDestroy() {
    super.onDestroy();
    unbindService(mConnection);
    }

来源:https://blog.csdn.net/weixin_44257960/article/details/103563918
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )