在Android studio里面使用AIDL

首先我们要明白aidl的作用是什么?比如说我们提供了一个服务,当别的程序(可以看成是一个其他的进程)要来使用我们提供的服务的时候,这个时候就需要用到aidl来进行通信.至于实现的原理度娘里面有大量的文章可以参考,并不是本文重点,所以不做赘述.

首先我们先来看看实现的效果.如下图所示.我们提供了一个加法计算的服务,在客户端使用aidl连接好服务端,然后传递参数给远程服务,就可以拿到计算后的值.



是不是非常的酷炫,下面就手把手的的教你在Android studio下面如何使用aidl技术实现如下的效果.

 1.首先创建一个提供服务server App然后再创建一个访问服务的client App

 .

2.接下来我们先对server 端的程序进行编辑.首先我们需要创建一个aidl的文件.创建目录如下图所示.这里我们创建一个名称为Calculation的aidl文件.

   3.接着我们需要对aidl的接口文件进行编辑,我们可以提供相应的方法.  

// Calculation.aidl
package com.dapeng.aidldemo;
interface Calculation {
  void addition(int a,int b);
}
    3.编辑好以后我们接下来生成aidl接口.首先要看看我们aidl所在的包是否是和我们清单文件的中的包名是否是一致的.如果是一致的我们直接点击rebuild parject.


     4.定义好aidl接口以后我们再来编辑服务端的代码.创建一个类继承service,并且在清单文件中配置好他的action,这里我们使用自己的包名去定义action.

      

public class CalculateService extends Service {
    public CalculateService() {
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("--", "onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("--", "onDestroy");
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.d("--", "onStart");
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d("--", "onUnbind");
        return super.onUnbind(intent);
    }

    Calculation.Stub mBinder = new Calculation.Stub() {
        @Override
        public int addition(int a, int b) throws RemoteException {
            return a + b;
        }
    };
}
  

 <service
            android:name=".CalculateService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.dapeng.aidldemo.CalculateService"/>
            </intent-filter>
  </service>

5.到此服务端的代码也就完成了.接着我们来写客户端的逻辑,首先是在客户端建一个和服务端的的aidl一样的包名并且将aidl接口文件放进去.然后rebuild project.


6.编辑客户端的代码进行实现.这里需要注意的是在使用隐式开启服务的时候在5.0及以上版本默认是不能直接通过action开启的,使用意图的时候加上setpackage就可以解决.

public class MainActivity extends AppCompatActivity {
    private EditText etOne, etTwo;
    private Button btn;
    private TextView tv;
    private Calculation mCalculation;
    private ServiceConnection mServiceConnection;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化界面
        etOne = (EditText) findViewById(R.id.etone);
        etTwo = (EditText) findViewById(R.id.ettwo);
        btn = (Button) findViewById(R.id.btn);
        tv = (TextView) findViewById(R.id.tv);
        //连接远程服务
        mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                mCalculation = Calculation.Stub.asInterface(service);
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                mCalculation = null;
            }
        };
        //使用意图对象绑定开启服务
        Intent intent = new Intent();
        intent.setAction("com.dapeng.aidldemo.CalculateService");
        //在5.0及以上版本必须要加上这个
        intent.setPackage("com.dapeng.aidldemo");
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = etOne.getText().toString();
                String s1 = etTwo.getText().toString();
                if (TextUtils.isEmpty(s) && TextUtils.isEmpty(s1)) {
                    Toast.makeText(MainActivity.this, "您输入的数字不合法", Toast.LENGTH_SHORT).show();
                } else {
                    try {
                        int addition = mCalculation.addition(Integer.parseInt(s), Integer.parseInt(s1));
                        StringBuilder stringBuilder = new StringBuilder();
                        stringBuilder.append("调用远程服务获取到的计算结果是==");
                        stringBuilder.append(addition);
                        tv.setText(stringBuilder.toString());
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}
  

到此为止功能就实现.快快去体验这酷炫的功能吧.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值