您的位置:首页 > 大数据 > 人工智能

AIDL使用笔记

2016-07-05 21:23 357 查看
aidl是 Android Interface definition language的缩写

这个的使用办法是在程序中申请一个service,然后返回一个对应的子类。其他应用通过这个服务获取到该进程的ADIL对象实例,从而使用AIDL通讯。

package a.b.c.d;
interface MyAidl
{
int getAge(String Name);
String getSex(String Name);
}


然后通过ADT生成对应的类。下面的代码是自动生成的。

/*
* This file is auto-generated.  DO NOT MODIFY.
* Original file: E:\\EW\\Aidl\\src\\a\\b\\c\\d\\MyAidl.aidl
*/
package a.b.c.d;
public interface MyAidl extends android.os.IInterface
{
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements a.b.c.d.MyAidl
{
private static final java.lang.String DESCRIPTOR = "a.b.c.d.MyAidl";
/** Construct the stub at attach it to the interface. */
public Stub()
{
this.attachInterface(this, DESCRIPTOR);
}
/**
* Cast an IBinder object into an a.b.c.d.MyAidl interface,
* generating a proxy if needed.
*/
public static a.b.c.d.MyAidl asInterface(android.os.IBinder obj)
{
if ((obj==null)) {
return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof a.b.c.d.MyAidl))) {
return ((a.b.c.d.MyAidl)iin);
}
return new a.b.c.d.MyAidl.Stub.Proxy(obj);
}
@Override public android.os.IBinder asBinder()
{
return this;
}
@Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
{
switch (code)
{
case INTERFACE_TRANSACTION:
{
reply.writeString(DESCRIPTOR);
return true;
}
case TRANSACTION_getAge:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _arg0;
_arg0 = data.readString();
int _result = this.getAge(_arg0);
reply.writeNoException();
reply.writeInt(_result);
return true;
}
case TRANSACTION_getSex:
{
data.enforceInterface(DESCRIPTOR);
java.lang.String _arg0;
_arg0 = data.readString();
java.lang.String _result = this.getSex(_arg0);
reply.writeNoException();
reply.writeString(_result);
return true;
}
}
return super.onTransact(code, data, reply, flags);
}
private static class Proxy implements a.b.c.d.MyAidl
{
private android.os.IBinder mRemote;
Proxy(android.os.IBinder remote)
{
mRemote = remote;
}
@Override public android.os.IBinder asBinder()
{
return mRemote;
}
public java.lang.String getInterfaceDescriptor()
{
return DESCRIPTOR;
}
@Override public int getAge(java.lang.String Name) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
int _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(Name);
mRemote.transact(Stub.TRANSACTION_getAge, _data, _reply, 0);
_reply.readException();
_result = _reply.readInt();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
@Override public java.lang.String getSex(java.lang.String Name) throws android.os.RemoteException
{
android.os.Parcel _data = android.os.Parcel.obtain();
android.os.Parcel _reply = android.os.Parcel.obtain();
java.lang.String _result;
try {
_data.writeInterfaceToken(DESCRIPTOR);
_data.writeString(Name);
mRemote.transact(Stub.TRANSACTION_getSex, _data, _reply, 0);
_reply.readException();
_result = _reply.readString();
}
finally {
_reply.recycle();
_data.recycle();
}
return _result;
}
}
static final int TRANSACTION_getAge = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
static final int TRANSACTION_getSex = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
}
public int getAge(java.lang.String Name) throws android.os.RemoteException;
public java.lang.String getSex(java.lang.String Name) throws android.os.RemoteException;
}


接下来需要在a.b.c.d的包下生成一个类,用于服务绑定的时候返回。

package a.b.c.d;

import java.util.ArrayList;
import java.util.List;

import android.os.RemoteException;

public class MyAidlObject extends MyAidl.Stub {

class person{
int age;
String nameString;
String sexString;
}

List<person> data = new ArrayList<person>();
public MyAidlObject() {
// TODO Auto-generated constructor stub
person a= new person();
a.age = 20;
a.nameString="Jack";
a.sexString = "M";
data.add(a);
a= new person();
a.age = 30;
a.nameString="Orz";
a.sexString = "W";
data.add(a);
a= new person();
a.age = 40;
a.nameString="Fzzz";
a.sexString = "M";
data.add(a);
a= new person();
a.age = 50;
a.nameString="Lucy";
a.sexString = "W";
data.add(a);
}

@Override
public int getAge(String Name) throws RemoteException {
// TODO Auto-generated method stub
for(person p :data){
if(Name.equals(p.nameString))
return p.age;
}
return -1;
}

@Override
public String getSex(String Name) throws RemoteException {
// TODO Auto-generated method stub
for(person p :data){
if(Name.equals(p.nameString))
return p.sexString;
}
return null;
}

}


接下来就是注册服务了。在AndroidManifest.mxl添加

<service
android:name="com.hhh.myaidl.MyService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.hhh.aidl.myService" />
</intent-filter>
</service>


剩下的明天继续补充。

继续

service代码

public class MyService extends Service {

@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return new MyAidlObject();
}

}


把aidl文件复制到另外一个应用下,使用同样的包名,开始使用服务

private ServiceConnection conn = new ServiceConnection() {

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
aidl = MyAidl.Stub.asInterface(service);
handler.post(new Runnable() {
public void run() {
show.setText("onServiceConnected");
}
});
Toast.makeText(MainActivity.this, "MyService connected", Toast.LENGTH_SHORT).show();
}

@Override
public void onServiceDisconnected(ComponentName name) {
//
9e1a
TODO Auto-generated method stub
aidl = null;
handler.post(new Runnable() {
public void run() {
show.setText(" onServiceDisconnected");
}
});
}

};


绑定服务代码。由于android5开始必须显式绑定,所以必须设置服务包名。

Intent mIntent = new Intent();
mIntent.setAction("com.hhh.aidl.myService");
mIntent.setPackage("com.hhh.myaidl");
bindService(mIntent, conn, Context.BIND_AUTO_CREATE);


AidlDemo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android