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(); }