android Service学习之AIDL

一、什么是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去实现简单的两个整数相加!

相关文章
相关标签/搜索