AIDL简单的示例

2018-01-18  本文已影响0人  颤抖的闪电

通常,AIDL 支持以下类型。

服务端的实现

一、编写 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 教程 (一)—— 简单的示例

上一篇下一篇

猜你喜欢

热点阅读