Android通过AIDL实现下载进程通信
在Android中, 每个应用程序都可以有自己的进程。在写UI应用的时候,经常要用到Service。在不同的进程中, 怎样传递对象呢?显然,Java中不允许跨进程内存共享。因此传递对象,只能把对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的。在J2EE中,采用RMI的方式,可以通过序列化传递对象。在Android中,则采用AIDL的方式。
这篇博文就来个具体的实现:AIDL进程间通信实现独立下载功能。
什么是AIDL呢?
AIDL(AndRoid接口描述语言)是一种接口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象。
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值。如果要使用AIDL,需要完成2件事情:
该实现分成了两个项目,一个是服务端,一个是客户端。服务端就是Service,运行在后台;客户端就是和Service通信的另一方了。package com.obatu.client.download;import com.obatu.services.aidl.IDownLoadService;import com.obatu.services.aidl.Queue;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Environment;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.widget.Button;public class DownLoadActivity extends Activity {private static final String SERVICE_ACTION = "com.obatu.service.download_service";//服务接口private IDownLoadService downloadService;//服务绑定器private ServiceConnection sConnect = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) { Log.i("ServiceConnection", "onServiceDisconnected() called");}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// 绑定到服务 Log.i("ServiceConnection", "onServiceConnected() called"); downloadService = IDownLoadService.Stub.asInterface(service);}}; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);//绑定服务 Intent intent = new Intent(SERVICE_ACTION); bindService(intent, sConnect, Context.BIND_AUTO_CREATE); Button startdown = (Button)findViewById(R.id.startdown);//下载操作 startdown.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Queue queue = new Queue(); queue.setId(1); queue.setName("愤怒的小鸟"); queue.setSavePath(Environment.getExternalStorageDirectory().getAbsolutePath()+"/angrybirds.apk"); queue.setUrl("http://www.obatu.com/download/app?code=47c10b353d6892d5d50bef4cfc788436"); //queue.setDowningIntent("com.obatu.client.DownLoadActivity"); //queue.setCompleteIntent("com.obatu.client.installActivity"); try {downloadService.down(queue);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }); }}