首先我们要明白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>
6.编辑客户端的代码进行实现.这里需要注意的是在使用隐式开启服务的时候在5.0及以上版本默认是不能直接通过action开启的,使用意图的时候加上setpackname就可以解决.
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(); } } } }); } }
到此为止功能就实现.快快去体验这酷炫的功能吧.
原文:http://blog.csdn.net/unreliable_narrator/article/details/51095169