美文网首页
AIDL简单的示例

AIDL简单的示例

作者: 颤抖的闪电 | 来源:发表于2018-01-18 17:03 被阅读0次

    通常,AIDL 支持以下类型。

    • Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
    • String
    • CharSequence
    • List
      List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
    • Map
      Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map,如 Map

    服务端的实现

    一、编写 aidl 文件
    IEasyService.aidl,文件存放在aidl文件夹中

    package xj.musicserver.easy;
    
    // Declare any non-default types here with import statements
    
    interface IEasyService {
        /**
         * Demonstrates some basic types that you can use as parameters
         * and return values in AIDL.
         */
        void connect(String mes);
        void disConnect(String mes);
    }
    
    服务端aidl文件结构.png

    二、编写一个 Service,实现接口

    public class EasyService extends Service {
    
        private static final String TAG = "EasyService";
        public EasyService() {
        }
    
        IEasyService.Stub mIBinder=new IEasyService.Stub() {
            @Override
            public void connect(String mes) throws RemoteException {
                LogUtil.i(TAG,"connect:   mes =" + mes);
    
            }
    
            @Override
            public void disConnect(String mes) throws RemoteException {
                LogUtil.i(TAG, "disConnect:  mes =" +mes);
            }
        };
    
        @Override
        public IBinder onBind(Intent intent) {
            LogUtil.i(TAG,"onBind:   intent = "+intent.toString());
            return mIBinder;
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            LogUtil.i(TAG,"onUnbind:   =");
            return super.onUnbind(intent);
    
        }
    
        @Override
        public void onDestroy() {
            LogUtil.i(TAG,"onDestroy:   =");
            super.onDestroy();
        }
    }
    

    三、注册AndroidManifest 文件,配置 Service 的 action 及 exported 等信息。

    其中 android:exported=”true” 表示别的进程可以访问,这个是必须配置的。android:process=”:remote” 表示运行在 :remote 进程,不配置的话默认运行所在的 App 进程,这个可以不配置。

    <service
        android:name=".easy.EasyService"
        android:enabled="true"
        android:exported="true"
        android:process=":remote">
    
        <intent-filter>
            <action android:name="xj.musicserver.easy.IEasyService"/>
        </intent-filter>
    </service>
    

    客户端的实现

    第一步:将服务端的 aidl 文件 copy 过来,注意要放在同一个包下

    客户端aidl文件结构.png

    第二步,通过服务端 Service 的 Action 启动
    当启动 Service 成功的时候,将服务端返回的 Binder 保存下来并转化成相应的实例.
    (注意在 Android 5.0以后,不能通过隐式 Intent 启动 service,必须制定包名)
    当我们点击按钮的时候,我们通过 Action 去启动远程 servic。

    case R.id.btn_start_service:
        LogUtil.i(TAG,"onButtonClick:   btn_start_service=");
        Intent intent = new Intent(ACTION);
        // 注意在 Android 5.0以后,不能通过隐式 Intent 启动 service,必须制定包名
        intent.setPackage(XJ_MUSICSERVER);
        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    
    private static final String ACTION = "xj.musicserver.easy.IEasyService";
    
    private IEasyService mIEasyService;
    
    ServiceConnection mServiceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIEasyService = IEasyService.Stub.asInterface(service);
        }
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
            mIEasyService=null;
        }
    };
    

    第三步:与服务端通讯
    通过保存下来的 Binder,即可调用服务端的方法。比如当我们点击按钮的时候,调用 connect 方法。

    case R.id.btn_contact:
        LogUtil.i(TAG,"onButtonClick:   btn_contact=");
        if(mIEasyService!=null){
            mIEasyService.connect(" Cilent connect");
        }
    
    

    感谢:
    Android AIDL 教程 (一)—— 简单的示例

    相关文章

      网友评论

          本文标题:AIDL简单的示例

          本文链接:https://www.haomeiwen.com/subject/htmioxtx.html