android服务数据跨应用传送(2)

如果想要跨应用来调用服务中的方法,如何办到?通常的做法是采用AIDL技术.AIDL技术主要采用定义双方应用之间可以共同识别的接口来进行沟通.

在服务端中,我们定义一些接口来规划将来要完成的任务:

interface IDownload { //下载数据void download(String path);void savePerson(in Person p); }

然后,将该接口的.java文件改成后缀名为.aidl的文件.

使用工具改变之后,android工程会自动的在Gen目录中生成接口同名的java文件.

打开该文件,发现其中代码很复杂. 但其实我们需要关注的代码很有限. 首先,发现其中存在Stub子类,继承了我们刚刚编写的接口,而且还继承了Binder类. 其次,发送其中存在一个方法:

asInterface(android.os.IBinder obj)

接下来进行我们的工作:

在我们的服务类中绑定服务,返回自定义的Binder类.

public IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn new MyBinder();}

在自定义的Binder类中,继承我们刚才观察的Stup类:

private class MyBinder extends Stub{@Overridepublic void download(String path) throws RemoteException {// TODO Auto-generated method stubLog.v(“tag”, “下载文件”);}@Overridepublic void savePerson(Person p) throws RemoteException {// TODO Auto-generated method stubLog.v(“tag”,”保存数据:”+p.toString());}

那么,服务端的代码基本编写好了,我们现在的目的是需要在另外的应用中调用我们MyBinder类中的方法来执行我们的任务.

再次之前,需要声明: 在savePerson中,存在我们自定义的Person类,那么在aidl中,对于这样的自定义类也是有定义要求的:

public class Person implements Parcelable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public Person() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int describeContents() {// TODO Auto-generated method stubreturn 0;}public void writeToParcel(Parcel dest, int flags) {//将数据写入Parcel对象的方法dest.writeInt(age);dest.writeString(name);}public void readFromParcel(Parcel _reply) {//从Parcel对象中读取数据的方法this.age = _reply.readInt();this.name = _reply.readString();} //必须覆写的方法,否则不会成功public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {public Person createFromParcel(Parcel in) {return new Person(in.readString(),in.readInt());}public Person[] newArray(int size) {return new Person[size];}};

}

定义完Person类之后,还要创建同名的.aidl文件. Person.aidl 其内容是:

package com.example.myaidlserverdemo02.bean; parcelable Person;

只有这样,我们的其他的.aidl文件引用Person时才不会出错.

正如,我们接口的.aidl文件中的定义:

package com.example.myaidlserverdemo02.inteface; import com.example.myaidlserverdemo02.bean.Person; interface IDownload {//下载数据void download(String path);void savePerson(in Person p); }

这样,我们的服务端代码编写完毕.

在客户端中: 首先,我们要将服务端所编写的关于.aidl文件的所有.java .adil文件的包拷贝复制到客户端对应的目录下,确保其所放的位置与服务端相同.例如,这里,我们需要将服务端的 Person.java Person.aidl 接口 IDwonLoad.aidl文件与所在的包全部拷贝到客户端的响应位置. 这样做,我们客户端的Gen目录下也会自动生成一些.java文件.

以上操作的目的主要是在客户端与服务端之间,共同存放一些可以是被的文件,通过这些文件来进行跨应用的通讯.

在客户端的Gen目录下,我们可以获取到接口对象IDownLoad.

在绑定服务的代码中:

private ServiceConnection conn=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//获取传过来的对象 idownload=IDownload.Stub.asInterface(service);try { //调用下载的方法idownload.download(“http://baidu.com”);Person person=new Person();person.setAge(34);person.setName(“李云龙”);//调用保存的 方法idownload.savePerson(person);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};

,每一个成功者都有一个开始。勇于开始,才能找到成功的路。

android服务数据跨应用传送(2)

相关文章:

你感兴趣的文章:

标签云: