AIDL(2):通过传输复杂对象

来源:互联网 发布:php手册 pdf 编辑:程序博客网 时间:2024/06/11 01:24

IPC通过AIDL传递复杂对象

1.定义数据传输对象


Person.aidl文件:


Person.java文件中:

(1)实现parcelable接口

(2)提供一个名为CREATOR的static final属性

package com.liujun.aidl;

import android.os.Parcel;

import android.os.Parcelable;

public class Person implements Parcelable{

private String name;

private int sex;

public Person(){

}

public Person(Parcel source){

readFromParcel(source);

}

//必须提供一个名为CREATOR的static final属性 该属性需要实现android.os.Parcelable.Creator<T>接口  

public static final Parcelable.Creator<Person> CREATOR =new Parcelable.Creator<Person>() {

@Override

public Person createFromParcel(Parcel source) {

return new Person(source);

}

@Override

public Person[] newArray(int size) {

return new Person[size];

}

};

@Override

public int describeContents() {

return 0;

}

//注意读取变量和写入变量的顺序应该一致 不然得不到正确的结果  

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(name);

dest.writeInt(sex);

}

//注意读取变量和写入变量的顺序应该一致 不然得不到正确的结果  

    public void readFromParcel(Parcel source) {  

    

        name = source.readString();  

        sex = source.readInt();  

    }

    

    //////////////////////////////////////////////////////////////////

    

    

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getSex() {

return sex;

}

public void setSex(int sex) {

this.sex = sex;

}  

}

2.定义远程服务接口和服务组件

IGreetService.aidl文件:

package com.liujun.aidl;

import com.liujun.aidl.Person;

interface IGreetService{

String greet(in Person person);

}

        AIDLService.java文件:

package com.liujun.service;

import com.liujun.aidl.IGreetService;

import com.liujun.aidl.Person;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.os.RemoteException;

import android.util.Log;

public class AIDLService extends Service {

private static final String TAG = "liujun";  

 

@Override

public void onCreate() {

 Log.i(TAG"onCreate() called");  

super.onCreate();

 

@Override

public IBinder onBind(Intent arg0) {

Log.i(TAG"onBind() called");  

return stub;

}

//服务接口实例对象

IGreetService.Stub stub=new IGreetService.Stub() {

@Override

public String greet(Person person) throws RemoteException {

 Log.i(TAG"greet(Person person) called");  

return ServiceMethod(person);

}

};

      

    @Override  

    public boolean onUnbind(Intent intent) {  

        Log.i(TAG"onUnbind() called");  

        return true;  

    }  

      

    @Override  

    public void onDestroy() {  

        super.onDestroy();  

        Log.i(TAG"onDestroy() called");  

    }  

    /////////////////-----------------------------------

    

/**

 * 服务组件方法

 * @param person

 * @return

 */

public String ServiceMethod(Person person){

 String greeting = "hello, " + person.getName();  

 

         switch (person.getSex()) {  

         

         case 0:  

             greeting = greeting + ", you're handsome.";  工程代码

             break;  

         case 1:  

             greeting = greeting + ", you're beautiful.";  

             break;  

         }  

         

         return greeting;  

}

}

注册服务:

 <!-- 配置服务组件 -->

<service android:name="com.liujun.service.AIDLService">

   <intent-filter>

     <action android:name="android.intent.action.AIDLService" />  

     <category android:name="android.intent.category.DEFAULT" />        

   </intent-filter>

</service>

3.客户端程序复制服务端程序数据传输对象和接口文件


4.绑定远程服务,调用远程服务方法,传输复杂对象

package com.liujun.parcelableclient;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;import com.example.parcelableclient.R;import com.liujun.aidl.IGreetService;import com.liujun.aidl.Person;public class MainActivity extends Activity { //控件 private Button bindBtn;   private Button greetBtn;   private Button unbindBtn;    private boolean mBound=false;//是否绑定远程服务  //远程服务接口对象 private IGreetService iService;  //获取远程服务接口对象 private ServiceConnection conn=new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {iService=IGreetService.Stub.asInterface(service);mBound=true;}   @Overridepublic void onServiceDisconnected(ComponentName name) {mBound=false;iService=null;}}; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bindBtn=(Button) this.findViewById(R.id.bindBtn);greetBtn=(Button) this.findViewById(R.id.greetBtn);unbindBtn=(Button) this.findViewById(R.id.unbandBtn);//注册点击监听器MyListener listener=new MyListener();bindBtn.setOnClickListener(listener);greetBtn.setOnClickListener(listener);unbindBtn.setOnClickListener(listener);}/** * 事件处理器 * @author asus * */private class MyListener implements OnClickListener{@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bindBtn://绑定远程服务Intent intent = new Intent("android.intent.action.AIDLService");              bindService(intent, conn, Context.BIND_AUTO_CREATE);              //设置按钮状态            bindBtn.setEnabled(false);                  greetBtn.setEnabled(true);                  unbindBtn.setEnabled(true);  break;case R.id.greetBtn:  try {                        Person person = new Person();                    person.setName("liujun");                    person.setSex(0);                                        String retVal = iService.greet(person);                                        Toast.makeText(MainActivity.this, retVal, Toast.LENGTH_SHORT).show();                                    } catch (RemoteException e) {                                    Toast.makeText(MainActivity.this, "error", Toast.LENGTH_SHORT).show();                  }  break;case R.id.unbandBtn:                unbindService(conn);                                  bindBtn.setEnabled(true);                  greetBtn.setEnabled(false);                  unbindBtn.setEnabled(false);  break;}}}@Overrideprotected void onDestroy() {super.onDestroy();if (mBound) {unbindService(conn);iService=null;}}}
工程代码http://download.csdn.net/detail/u010739551/7710977

0 0
原创粉丝点击