android studio aidl例子,Android Studio 使用AIDL

最近在研究AIDL,看了好多文章都是在eclipse下面进行完成的,对于喜欢用as的我来说决定在Android Studio下面实现。中间遇到不少麻烦,最后通过猜想和尝试还好解决了。我是这么做的。

在eclipse里面操作时aidl文件个java文件都放在一个包下, 客户端直接将该包复制到自己的目录下,然后可以另外建另外一个包放其他代码。但在android studio下面这样是不可以的,需要在src单独建一个AIDL文件夹,将aidl文件放在里面,java文件在另外的包下,这样就导致服务端项目与客户端项目的包名必须相同。在as中project相当于es的workspace,moudle相当于es的project,在eclipse里面是两个project在通信,so 我猜测在as中是两个mould在通信,因此建了一个project(里面自带一个app module),让app moulde作为客户端然后又另外加了一个服务端moudle 叫aidlserver。在aidlserver的project视图下面的src下面右键new 选择AIDL ,AIDL Folder ,然后将自己的aidl文件放入其中。

下面是一个简单的例子

aidlserver的Girl.aidl

package com.test.huangxingli.aidlserver;

parcelable Girl;

这是AIDLServerService.aidl

// AIDLServerService.aidl

package com.test.huangxingli.aidlserver;

import com.test.huangxingli.aidlserver.Girl;

// Declare any non-default types here with import statements

interface AIDLServerService {

String sayHello();

Girl getGirl();

}

建好这两个文件后再编写Girl.java .注意要先写Girl.aidl然后再写Girl.java 刚开始时 我先写的Girl.java 然后再写Girl.aidl时提示不能创建重名的文件。

Girl.java如下:

package com.test.huangxingli.aidlserver;

import android.os.Parcel;

import android.os.Parcelable;

/**

* Created by huangxingli on 2015/3/27.

*/

public class Girl  implements Parcelable{

String name;

int age;

public Girl() {

}

public String getName() {

return name;

}

public int getAge() {

return age;

}

public void setName(String name) {

this.name = name;

}

public void setAge(int age) {

this.age = age;

}

@Override

public int describeContents() {

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(name);

dest.writeInt(age);

}

public static final Creator CREATOR=new Creator() {

@Override

public Girl createFromParcel(Parcel source) {

Girl girl=new Girl();

girl.setName(source.readString());

girl.setAge(source.readInt());

return girl;

}

@Override

public Girl[] newArray(int size) {

return new Girl[size];

}

};

}

然后写Service类MAIDLServerService,如下:

package com.test.huangxingli.aidlserver;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

public class MAIDLServerService extends Service {

public MAIDLServerService() {

}

AIDLServerService.Stub binder=new AIDLServerService.Stub() {

@Override

public String sayHello() throws RemoteException {

return "hello, i am from AIDLServerService";

}

@Override

public Girl getGirl() throws RemoteException {

Girl girl=new Girl();

girl.setAge(25);

girl.setName("lily");

return girl;

}

};

@Override

public IBinder onBind(Intent intent) {

// TODO: Return the communication channel to the service.

return binder;

}

}

然后在manifest里面将该Service注册一下:如下

android:name="com.test.huangxingli.aidlserver.MAIDLServerService"

android:process=":remote"

>

intent-filter的作用是便于隐式调用该Service.

as项目创建时的MainActivity.java类,里面没做任何处理。

下面建客户端moulde,注意一定要将服务项目端的aidl文件夹复制到相应位置,之前我不是复制的,是新建的,包名类名都相同,可依然会编译不过,后来将自己建的删掉,然后复制过来就编过了,善意提醒一下,我在这浪费了不少时间,自己建的即使名字相同也编不过,各位还是copy吧。

然后在客户端下面将Girl.java也copy过来,再次提醒一下,客户端的有Girl.java的包名一定要与服务端有Girl.java的包名一样奥,否则提示找不到。

下面是我的客户端MainActivity.java的代码:

package com.test.huangxingli.aidlserver;

import android.content.ComponentName;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.IBinder;

import android.os.RemoteException;

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

TextView textView;

Button button;

AIDLServerService aidlServerService;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

button= (Button) findViewById(R.id.button);

textView= (TextView) findViewById(R.id.textView);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent intent=new Intent("com.test.huangxingli.aidlserver.MAIDLServerService");

bindService(intent,connection,BIND_AUTO_CREATE);

}

});

}

ServiceConnection connection=new ServiceConnection() {

String content;

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

aidlServerService=AIDLServerService.Stub.asInterface(service);

try {

content=aidlServerService.sayHello()+"\n";

Girl girl=aidlServerService.getGirl();

content +="my name is "+girl.getName();

textView.setText(content);

} catch (RemoteException e) {

e.printStackTrace();

}

}

@Override

public void onServiceDisconnected(ComponentName name) {

aidlServerService=null;

}

};

}

好了到此就全部处理好了,运行一下吧。

注:此时删掉aidlserver mould继续运行程序,依然能正常运行。但是如果直接在一个Mould中生成后使用是不可以达到效果的。看来对于AIDL这种技术的设计意图,使用场景还是要去了解一下。

附:aidl在项目中的位置:

7cfdb139332550b132f57a15db6dd662.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio中的AIDLAndroid接口定义语言的缩写,它是一种用于定义Android应用程序中的进程间通信(IPC)接口的语言。使用AIDL,您可以定义客户端和服务之间的接口,以便它们可以相互通信和交换数据。在Android应用程序中,AIDL通常用于实现跨进程通信,例如在应用程序中使用服务来执行后台任务。 ### 回答2: Android Studio AIDLAndroid Interface Definition Language)是一种用于在Android应用程序中进行进程间通信(IPC)的技术。它允许不同应用程序或同一应用程序中的不同进程之间进行数据和指令的传输和共享。AIDL基于Binder机制实现,是许多Android系统服务和框架中广泛使用的IPC技术。 在Android Studio使用AIDL,首先需要创建一个AIDL接口,该接口定义了可用于在不同进程之间进行通信的方法。一旦创建了该接口,它可以在应用程序中使用,与其他进程交换数据和指令。AIDLAndroid系统自动创建和管理,不需要手动实现Binder机制。 使用AIDL的主要优点是实现非常方便,而且可以跨多个进程使用。它使得应用程序能够高效地共享数据和指令,并允许不同进程之间进行通信,从而扩展了Android应用程序的功能和交互性。 一些开发人员可能认为AIDL的学习和使用一定的难度,但是一旦了解了AIDL的基本原理和使用方法,就能够轻松实现IPC功能,并创建更高效的Android应用程序。总之,通过使用AIDLAndroid应用程序开发人员可以实现更好的应用程序设计和创新,并提高应用程序的性能和用户体验。 ### 回答3: Android Studio AIDLAndroid Interface Definition Language)是一种跨进程通信的机制,用于在不同的Android组件之间进行通信。 AIDL类似于SOAP(Simple Object Access Protocol),RPC(Remote Procedure Call)或CORBA(Common Object Request Broker Architecture),它是一种高级的RPC机制,允许不同的应用程序使用相同的接口来进行通信。 AIDL的主要作用是允许一个应用程序通过一个中间层向另外的一个应用程序发送请求,并且读取响应信息。它是Android操作系统提供的默认RPC机制,由于基于Binder实现,因此具备更高的性能和更好的稳定性。 AIDL可以让你定义一组接口,用来描述应用组件之间的通信方法,包括输入和输出参数。AIDL文件定义完毕后,你可以使用Android Studio自动生成AIDL接口的Java类,以便你可以跨进程访问该接口。 使用AIDL的好处是,可以将系统拆分成独立的组件,这些组件可以在不同的进程之间进行通信,从而实现了更好的资源利用和更灵活的架构设计。 总之,Android Studio AIDL是一种强大的跨进程通信机制,有助于提高应用程序的性能和稳定性,从而让我们能够更好地设计和开发更高效的Android应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值