一、什么是AIDL?java
FAQ:百度百科上给出的解释:android
Android系统中的进程之间不能共享内存,所以,须要提供一些机制在不一样进程之间进行数据通讯。eclipse
为了使其余的应用程序也能够访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现。与不少其余的基于RPC的解决方案同样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。咱们知道4个Android应用程序组件中的3个(Activity、BroadcastReceiver和ContentProvider)均可以进行跨进程访问,另一个Android应用程序组件Service一样能够。所以,能够将这种能够跨进程访问的服务称为AIDL(Android Interface Definition Language)服务。ide
二、如何建立一个简单的AIDL项目?spa
FAQ:这里给出在eclipse环境下建立生成AIDL的实例,ADDService是服务端,提供实现加法的运算方法,ADDClient是客户端去调用服务端的方法,给出计算结果。代理
ADDService工程视图:code
ADDClient工程视图:xml
实现步骤:htm
(1)建立一个ADDService android工程,并在com.example.aidl包下实现名为AddOp.aidl的接口,实现相似java接口实现。对象
package com.example.aidl; interface AddOp { // 除了没有访问权限,其余和接口定义差很少 int addService(int a, int b); }
编译后会自动生成这个文件:
这个里面的代码是使用代理模式来实现的,咱们通常是定义该接口的静态内部类Stub的asInterface()方法,返回咱们的接口。
(2) 创建一个服务类AddOpService.java,并在其中实现了由aidl文件生成的java接口:
public class AddOpService extends Service { private static final String TAG = "AddOpService"; private IBinder binder = new AddOpBinder(); @Override public IBinder onBind(Intent intent) { Log.i(TAG, "onBind..."); return binder; } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "onCreate..."); } // 服务提供的方法经过Binder对象提供给外部 private int add(int a, int b) { Log.i(TAG, "add...a = " + a + ";b = " + b); return a + b; } class AddOpBinder extends AddOp.Stub {// 继承aidl生成的存根 @Override public int addService(int a, int b) throws RemoteException {// 实现次方法 return add(a, b);// 调用实现的方法 } } }
(3) 配置ADDService工程的AndroidManifest.xml,设置Service隐式启动的action:
<service android:name="com.example.addservice.AddOpService" > <intent-filter> <action android:name="com.example.aidl.AddOp.MY_ACTION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
至此ADDService开发完毕,接下来开发ADDClient工程;
(4) 将ADDService下的aidl整个包com.example.aidl拷贝到ADDClient下如上面ADDClient工程视图所示;
(5) 调用AddOp.java中的addService(int a, int b)方法去得出结果:
public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText a, b; private TextView c; private Button add; private AddOp addOp; private ServiceConnection conn = new AddOpServiceConnection(); private static final String MY_ACTION = "com.example.aidl.AddOp.MY_ACTION"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate"); a = (EditText) findViewById(R.id.a); b = (EditText) findViewById(R.id.b); c = (TextView) findViewById(R.id.c); add = (Button) findViewById(R.id.add); Intent intent = new Intent(); intent.setAction(MY_ACTION); bindService(intent, conn, BIND_AUTO_CREATE);// 绑定服务 add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int addResult; try { addResult = addOp.addService(Integer.parseInt(a.getText().toString()), Integer.parseInt(b.getText().toString())); c.setText("" + addResult); } catch (Exception e) { } } }); } class AddOpServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.i(TAG, "onServiceConnected"); addOp = AddOp.Stub.asInterface(service); // 将IBinder转换成接口类型 } @Override public void onServiceDisconnected(ComponentName name) { Log.i(TAG, "onServiceDisconnected"); addOp = null; } } }
至此,整个AIDL项目开发完毕,将两个APK安装到机器上,运行ADDClient这个APK,便可调用ADDService去实现简单的两个整数相加!