Android进程间通信AIDL的使用分析

Android进程间通信AIDL的使用:

1、简介

在Android当中,线程之间是不能进行相互传递信息,不能共享彼此的内存空间的,所以Android提供了AIDL来实现。

 AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如Service)对象的操作,就可以使用AIDL生成可序列化的参数。

对于AIDL的具体语法及使用,请查看文档:http://developer.android.com/guide/components/aidl.html这里有详细的说明。

2、使用

下面举个简单的例子,意在说明AIDL的使用,并没有实际的用途。例子是这样的,我们提供服务端和客户端两个项目,他们各自运行在自己的进程中,我们来实现他们之间的交互通信过程,当然,在客户端简单实现点击按钮,由服务端返回欢迎语“HELLO AIDL!”,具体如下:

服务端:

在服务端我们提供AIDL接口及服务的Service,并将该Service与AIDL金星绑定,实时监听请求。

AIDHelloService.aidl:

interface AIDLHelloService {

String sayHelloAidl();

}

 

RemoteService.java:

public class RemoteService extends Service {

private final AIDLHelloService.Stub binder = new AIDLHelloService.Stub() {

@Override

public String sayHelloAidl() throws RemoteException {

return "HELLO AIDL!";

}

};

@Override

public IBinder onBind(Intent arg0) {

return binder;

}

}

当然,这个Service就是当客户端点击请求的时候,返回欢迎语“HELLO AIDL!”给客户端。当编辑并保存了aidl之后,会在gen目录下自动生成aidl对应的.java文件。

客户端:

在客户端中,我们只需要提供请求的点击事件及负责连接不同进程间的服务连接器ServiceConnection,使用它来与另外的其它进行进行通信即可。因为客户端和服务端进行通信是使用相同的AIDL进行通信的,所以我们只需要将服务端实现的aidl的包复制到客户端的SRC目录下即可,接下来是具体的实现代码。

 

客户端请求点击事件:

public class AIDLHelloClientActivity extends Activity {

private AIDLHelloService aidlService;

private static boolean isServiceBound = false;

private ServiceConnection conn = new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

try {

aidlService = AIDLHelloService.Stub.asInterface(service);

catch(Exception e) {

e.printStackTrace();

return;

}

}

 

@Override

public void onServiceDisconnected(ComponentName name) {

aidlService = null;

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_aidlhello_client);

if(isServiceBound) {

unbindService(conn);

else {

Intent intent = new Intent("com.demo.aidlhelloserver.service.RemoteService");

bindService(intent, conn, Context.BIND_AUTO_CREATE);

}

isServiceBound = !isServiceBound;

}

public void sayHelloAidl(View v) {

if(null != aidlService) {

try {

Toast.makeText(this, aidlService.sayHelloAidl(),

Toast.LENGTH_SHORT).show();

catch (RemoteException e) {

e.printStackTrace();

return;

}

}

}

 

下面为运行的效果图:

服务端:

 

客户端:

 

好了,到这我们已经实现了AIDL的使用介绍。

3、注意

A、服务端的Service要记得注册

AndroidManifest.xml:

<!-- 服务注册 -->

        <service 

            android:name=".service.RemoteService">

            <intent-filter>

                <action android:name="com.demo.aidlhelloserver.service.RemoteService" />

            </intent-filter>

        </service>

B、复制服务端的AIDL到客户端

 

C、如果在gen下没有生成.aidl对应的.java文件,则将项目clean下重新编译即可。

 

/*

* Android技术交流群号:179914858

*  欢迎加入

*/

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云水之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值