玩转Andorid---组件篇---Service(服务)之RPC远程进程调用
?
package org.hualang.rpc;//IPerson接口interface IPerson{//设置年龄void setAge(int age);//设置姓名方法void setName(String name);//显示信息方法String display();}
?2、当创建好这个文件后,刷新工程,就会在gen目录下看到这个java接口
?当你分析了这个代码后会发现,它是使用的代理模式来实现的,我们一般定义该接口的静态内部类Stub的asInterface()方法,返回我们的接口
3、实现AIDL文件生成的JAVA接口
AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现
我们可以定义一个实现类,PerionImpl,该类继承Stub类,实现我们定义的3个方法
/** * @author hualang * IPerson接口实现类 */package org.hualang.rpc;import android.os.RemoteException;public class IPersonImpl extends IPerson.Stub {//声明两个变量private int age;private String name;//显示name和agepublic String display() throws RemoteException{return "name="+name+";age="+age;}@Overridepublic void setAge(int age) throws RemoteException {// TODO Auto-generated method stubthis.age = age;}@Overridepublic void setName(String name) throws RemoteException {// TODO Auto-generated method stubthis.name = name;}}
?4、将你的接口暴露给客户端
现在我们已经实现了IPerson接口,接下俩我们要看看如何将该接口暴露给客户端调用。一般我们通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们板顶该接口时调用该方法。
/** * @author hualang * 使用Service将接口暴露给客户端 */package org.hualang.rpc;import org.hualang.rpc.IPerson.Stub;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class RemoteService extends Service {//声明IPerson接口private Stub iperson = new IPersonImpl();public IBinder onBind(Intent intent){return iperson;}}
?5、客户端调用
接下来定义一个Activity来绑定远程Service,获得IPerson接口,通过RPC机制调用接口中的方法。
/** * @author hualang * IPerson接口实现类 */package org.hualang.rpc;import android.app.Activity;import android.app.Service;import android.content.ComponentName;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;public class RPCTest extends Activity { /** Called when the activity is first created. */private IPerson iPerson;private Button btn;private ServiceConnection conn = new ServiceConnection(){synchronized public void onServiceConnected(ComponentName name, IBinder service) {// 获得IPerson接口iPerson = IPerson.Stub.asInterface(service);if (iPerson != null)try {// RPC 方法调用iPerson.setName("花郎");iPerson.setAge(22);String msg = iPerson.display();// 显示方法调用返回值Toast.makeText(RPCTest.this, msg, Toast.LENGTH_LONG).show();} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}};//声明IPerson接口 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button)findViewById(R.id.Button01); btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent();intent.setAction("org.hualang.rpc.RPC_ACTION");bindService(intent, conn, Service.BIND_AUTO_CREATE);} } ); }}
?6、注意要在AndroidManifest.xml文件中注册Service
<serviceandroid:name=".RemoteService"><intent-filter><action android:name="org.hualang.rpc.RPC_ACTION"/></intent-filter></service>
?
运行结果如下:当点击按钮后,就会弹出远程调用后的Toast
?
?
?