Android AIDL原理

来源:互联网 发布:vba聊天软件 编辑:程序博客网 时间:2024/06/06 14:03

AIDL: Android Interface Define Language,Android接口定义语言

主要作用:可以用来定义进程间的通信接口


具体来讲,如果项目 B 想要访问项目 A 中的一些数据

1)在 项目 A 中创建好AIDL文件,在它里面定义好相关的接口:

package com.aidy.a.aidlservice;interface RemoteService {String doSomething();}

2)再定义一个Service,在Service中创建要给内部类继承于RemoteService.Stub

public class AService extends Service {@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn new AIBinder();}public class AIBinder extends RemoteService.Stub {@Overridepublic String doSomething() throws RemoteException {// TODO Auto-generated method stubreturn "test do something...";}}}

同时在AndroidMenifest.xml中进行声明:

        <service android:name="com.aidy.a.AService" >            <intent-filter>                <action android:name="com.aidy.a.aidlservice.RemoteService" />            </intent-filter>        </service>
上述Action: com.aidy.a.aidlservice.RemoteService就是进程之间可以进行通信的一个契约ID

那么在 A 项目中我们想要使用该Service可以:

public class AMainActivity extends Activity {private AIBinder aIBinder = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");this.bindService(intent, new AServiceConnection(), Service.BIND_AUTO_CREATE);((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {Toast.makeText(AMainActivity.this, aIBinder.doSomething(), Toast.LENGTH_SHORT).show();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}private final class AServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubaIBinder = (AIBinder) service;}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubaIBinder = null;}}}
工程 A 的目录结构:


现在有一个工程 B 想要与 A 进行通信:

1)将 A 当中的RemoteService.aidl文件拷贝到 B 当中来(保持RemoteService.aidl的包名不变)

调用如下:

public class BMainActivity extends Activity {private RemoteService remoteService = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent("com.aidy.a.aidlservice.RemoteService");this.bindService(intent, new BServiceConnection(), Service.BIND_AUTO_CREATE);</span>((Button) findViewById(R.id.button)).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtry {Toast.makeText(BMainActivity.this, remoteService.doSomething(), Toast.LENGTH_SHORT).show();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}private final class BServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubremoteService = RemoteService.Stub.asInterface(service);</span>}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubremoteService = null;}}}


B 的目录结构:

在B中点击按钮就会执行对应的doSomething()操作





0 0
原创粉丝点击