Android AIDL使用

AIDL定义

AIDL (Android Interface Definition Language) 是一种接口定义语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数,来完成进程间通信。

AIDL的用法

AIDL的实现一共分为三部分,一部分是客户端,调用远程服务。一部分是服务端,提供服务。最后一部分,也是最关键的是AIDL接口,用来传递的参数,提供进程间通信。

第一步 创建Aidl文件

在aidl文件 写两个方法

interface IBinderPool {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
   void setId(int id);
   int getId();
}

makePro之后,系统会自动根据aidl生成对应的接口

public interface IBinderPool extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.yihui.testactivity.IBinderPool
{

第二步 创建一个service

public class testService extends Service {
    private int id;

    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    private IBinder iBinder = new IBinderPool.Stub() {
        @Override
        public void setId(int iid) throws RemoteException {
            id =iid;
        }

        @Override
        public int getId() throws RemoteException {
            return id;
        }
    };
}

设置service的进程,用来模拟跨进城访问

<activity
     android:name=".MainActivity"
     android:process=":test">
     <intent-filter>
          <action android:name="android.intent.action.MAIN" />

         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

第三步

 private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iBinderPool = IBinderPool.Stub.asInterface(service);
            try {
                tv_two_name.setText(iBinderPool.getId()+"");
                Log.i("TwoActivity","first:" + iBinderPool.getId());
                iBinderPool.setId(777777);
                Log.i("TwoActivity","next:" + iBinderPool.getId());
            }catch (RemoteException e){

            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    };
  Intent intent = new Intent(ServiceActivity1.this, testService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);

        tv_two_name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    iBinderPool.setId(111111);
                    tv_two_name.setText(iBinderPool.getId()+"");
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });

aidl 的底层其实是使用Binder机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值