Service AIDL进程间通讯

AIDL进程间通讯java

service端android

    声明一个DataService.aidl接口(aidl中不要忘了添加包名)this

interface DataService{
	int getString(String str);
	boolean getList(in List<String> list,out List<String> list2);
	void showPeron(in Person perosn);
}

    参数中的in:表示接收数据;out:表示发送数据;也能够是inoutspa

    该类在gen目录下会自动生成一个DataService.java的文件,DataService.Stub在client中得到DataService的实体类和        IBinder对像code

    声明一个Servicexml

Public class ServiceService{
        Binder binder = DataService.Stub(){
		//DataService的抽象方法,处理要输入输出的数据
		int getString(String str){
			if("hello".equals("hello")){
				return 1;
			}
			return 0;
		}
		boolean getList(int List<String> list,List<String> list2){
			//输出list查看
			list2.add("name");
			if(list.getSize()>0){
				return true;
			}
			return false;
		}

		showPerson(Person person){
			//输出perons的数据
		}
	};
	onCreate(){}
	onDestroy(){}
	onBinder(){
		return binder;
	}
	
}


    Activity中启动service对象

Intent intent = new Intent(this,ServiceSerivice.class);
startService(intent);

    

    配置文件中注册ServiceService,继承

<service android:name=".ServiceService">
	<intent-filter>
		<action android:name="DataService.aidl的包名+接口名字"/>
	</intent-filter>
</service>


client端接口

    新建一个DataService.aidl,包名跟service端的DataService.aidl包名相同进程

    Activity绑定service,而后调用服务数据交互

Intent intent = new Intent(DataService.class.getName());
bindService(intent,connection,Context.BIND_AUTO_CREATE);

ServiceConnection connection = new ServiceConncetion(){
	onServiceDisconnceted(ComponentName name){}
	onServiceConnected(ComponentName name, Ibinder servcie){
		DataService dataService = DataService.Stub.asInterface(service);
		int result = dataService.getString("hello");
		ArrayList<String> list = new ArrayList<String>{};
		list.add("a");
		ArrayList<String> list2 = new ArrayList<String>{};
		boolean result2 = dataService.getList(list,list2);
		//输出result、result一、lsit2
	}
}


    若是须要传递自定义的实体类,实体类需序列化(Serializable、Parcelable),二者之间的区别:(java中)Serializable, 这个接口序列化内部操做看不到,不能更改。android中认为Serializable中的机制不符合咱们的需求。

    Service端和客户端须要在.aidl的包下建立实体类和它的aidl文件。如:Person.java和Person.aidl

    Person.aidl中内容

Parcelable Person;//用来约束Person这个对象

    PerSon.java序列化继承Parcelable

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
	Person createFromParcel(Parcel source){
		return new Person(source);
	}
	Person[] newArray(int size){
		return new Person[size];
	}
};//公有静态
void writeToParcel(Parcel dest,int flags){
	dest.writeInt(age);
	dest.writeString(name);
}

public Person(Parcel parcel){
	readFromParcel(parcel);
}
void readFromParcel(Parcel in){
	age = in.readInt();
	name = in.readString();
}
相关文章
相关标签/搜索