您的位置:首页 > 移动开发 > Android开发

Android服务之Service(其二)关于AIDL进程间通信

2013-11-20 10:26 495 查看
Android服务之Service(其二)关于AIDL进程间通信

上一节中我们讲解了本地Service,这一节主要是讲解远程Service,这里涉及到了AIDL。
好吧,老规矩,先来点基础知识:

一.基础知识

AIDL的作用

在Android平台,每个应用程序App都运行在自己的进程空间。通常一 个进程不能访问另一个进程的内存空间(一个应用不能访问另一个应用),如果想沟通,需要将对象分解成操作系统可以理解的基本单元,Android提供了AIDL来处理。

AIDL (Android Interface Definition Language)
是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication,
IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参
数。换句比较浅显的话来说,就是我这个App应用的activity,需要调用其他App应用的Service.当然同一App应用的activity 与service也可以在不同进程间,这可以设置Service配置中,android:process=":remote"
AIDL的使用

官方文档特别提醒我们何时使用AIDL是必要的:只有你允许客户端从不同的应用程序为了进程间的通信而去访问你的service,以及想在你的service处理多线程。(太生硬了,不同进程的组件调用吧。)

那么怎么制作AIDL呢?下面步骤

1:创建.aidl文件。新建立个文件并且以[b].aidl
为后缀保存,在这个文件中编写接口以及方法,这个我们普通java接口声明是一样的,不同的是要显示import
复杂类型,即便复杂类型对象在同一个包内。Java基本数据类型 (int, long, char,
boolean等),String和CharSequence,集合接口类型List和Map,不需要import 。[/b]

比如:

package com.dongzi;
interface IStockQuoteService{
double getPrice(String ticker);
}

2:创建好AIDL文件后,刷新下工程,你会发现在gen包下,对应的包下面出现一个与AIDL文件相同的java文件。如:

package com.dongzi;

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.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MYyActivity extends Activity {
static final String TAG="MYyActivity";
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnCall=(Button)findViewById(R.id.btnCall);
if(btnCall!=null)
btnCall.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
//绑定一个服务
bindMyService();
}
});
}

IStockQuoteService iService=null;
private ServiceConnection  conn=new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//返回AIDL接口对象,然后可以调用AIDL方法
iService=IStockQuoteService.Stub.asInterface(service);
double value=0.0;
try {
value=iService.getPrice("");
}
catch (RemoteException e) {
Log.e(TAG,"调用出错!");
e.printStackTrace();
}
Log.e(TAG, "返回数值为:"+value);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i(TAG, "释放Service");
}
};

private void bindMyService(){
// Intent intent=new Intent("com.dongzi.IStockQuoteService");
Intent intent=new Intent(this,MyService.class);
startService(intent);

bindService(intent, conn, Context.BIND_AUTO_CREATE);
}
}


在按钮点击时候启动service,然后再绑定这个Service.在连接到服务后,我们会发现,调用AIDL中定义的方法成了,打印如下:



项目结构为:



【转载】http://www.cnblogs.com/zhangdongzi/archive/2012/01/09/2317197.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: