1、实验四 远程服务天津理工大学计算机与通讯工程学院实验报告2012 至 2013 学年 第 二 学期实验四 远程服务课程名称软件主流开发平台与工具学号学生姓名年级专业教学班号实验地点实验时间 主讲教师 辅导教师实验(四)实验名称远程Service软件环境WindowsEcllipse & Android SDK硬件环境PC 实验目的:完成Android远程服务建立及绑定,以及进程间数据传递完成Android应用程序建立及界面处理技术,包括以下内容: Android应用层程序建立 远程服务定义及实现(AIDL语言定义接口) 远程服务绑定及调用 进程间数据传递(AIDL语言定义数据结构,Parcel
2、able接口实现)实验内容(应包括实验题目、实验要求、实验任务等)实验要求:完善“Calcultor”功能,实现远程调用与进程间数据传递在已有本地服务调用程序基础上,分步骤实现下述功能:步骤一、AIDL定义远程服务接口。定义远程服务,并将已有本地服务移植到远程服务中。实现远程服务调用步骤二、AIDL语言定义AllResult数据结构(数据元素为两个整数的和、差、积、商的计算结果)实现AllResult.java类,利用该类实现Parcelable接口,用于远程数据传递远程服务中定义新方法Compute,输入值为两个整数,返回值为AllResultActivity显示调用结果(如下图)实验过程与
3、实验结果(可包括实验实施的步骤、算法描述、流程、结论等)实验步骤:主要实验步骤是(1)使用AIDL语言定义跨进程服务的接口。(2)通过继承Service类实现跨进程服务。(3)绑定和使用跨进程服务。参照书中P137页RemoteMathServiceDemo示例。用到的比较大小,Compare()方法如下: public int Compare(int a, int b) throws RemoteException if(a b) return a; else return b; 用到的求和,求差,求积,求商Compute()方法如下: public AllResult Compute(in
4、t a, int b) throws RemoteException int addResult = a + b; int subResult = a - b; int mulResult = a * b; double divResult = (double) a / (double) b; AllResult result = new AllResult(addResult, subResult, mulResult, divResult); return result; 步骤一、AIDL定义远程服务接口。用AIDL语言定义RemoteCalculatorService的服务接口,文件名为
5、IRemoteCalculatorService.aidl。package edu.tjut.cs.RemoteCalculatorService;import edu.tjut.cs.RemoteCalculatorService.AllResult;interface IRemoteCalculatorService int Compare(int a, int b); AllResult Compute(int a, int b);从上面代码中知,IRemoteCalculatorService接口含有两个方法,传入的参数是两个int型整数。第一个方法Compare()用于实现两个整数的
6、比较,返回较大者,具体实现见上面该方法代码。第二个方法Computer()实现了两个整数的求和,求差,求积,求商。使用Eclipse编辑IRemoteCalculatorService.aidl文件,当用户保存文件后,ADT会自动在gen目录下生成IRemoteCalculatorService.java文件,文件结构如下:IRemoteCalculatorService.java文件根据IRemoteCalculatorService.aidl的定义,生成一个内部静态抽象类Stub继承了Binder类,并实现IRemoteCalculatorService接口。在Stub类中,还包含一个重要
7、的静态类Proxy,类Proxy用来实现跨进程服务调用,而Stub类是实现进程内服务调用。步骤二 通过继承Service类实现跨进程服务。实现跨进程服务需要建立一个继承android.app.Service的类,并在该类中通过onBind()方法返回IBinder对象,调用者使用返回的IBinder对象就可访问跨进程服务。onBind对象的建立通过使用IRemoteCalculatorService.java内部的Stub类实现,并逐一实现在IRemoteCalculatorService.aidl接口文件定义的函数。具体代码如下:package edu.tjut.cs.calculator;
8、import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.util.Log;public class CalculatorService extends Service private final IBinder mBinder = new LocalBinder(); private Thread workThread; private boolean multiThreadFlag = false; Ov
9、erride public void onCreate() / TODO Auto-generated method stub workThread = new Thread(null, backgroundWork, WorkThread); super.onCreate(); public class LocalBinder extends Binder CalculatorService getService() return CalculatorService.this; Override public boolean onUnbind(Intent intent) / TODO Au
10、to-generated method stub if(multiThreadFlag = true) workThread.interrupt(); Log.v(XXXX, interrupted); multiThreadFlag = false; return super.onUnbind(intent); Override public IBinder onBind(Intent arg0) / TODO Auto-generated method stub if(arg0.getBooleanExtra(MultiThread, false) = true) workThread.s
11、tart(); multiThreadFlag = true; return null; return mBinder; public int compare(int a, int b) if(a b) return a; else return b; private Runnable backgroundWork = new Runnable() Override public void run() while(!Thread.interrupted() int input1 = (int) (100*Math.random(); int input2 = (int) (100*Math.r
12、andom(); int result = (input1 input2) ? input1 : input2; try Thread.sleep(1000); catch (InterruptedException e) / TODO Auto-generated catch block e.printStackTrace(); CalculatorActivity.UpdateGUI(input1, input2, result); ;步骤二 绑定和使用跨进程服务。该实验用户可以绑定进程服务,也可以取消服务绑定。应用程序在调用跨进程服务时,应用程序与跨进程服务应具有相同的Proxy类和签名
13、函数,这样才能使数据在调用者处打包后,可以在远程访问端正确拆包。比较重要的是“比较”按钮的监听事件: compareButton.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub String msg = ; if(calculatorService = null) msg = 服务尚未启动; resultTextView.setText(msg); else /int result = calculatorSp
14、are(Integer.parseInt(inputEditText1.getText().toString(), Integer.parseInt(inputEditText2.getText().toString(); int result = 0; AllResult allResult = null; try result = calculatorService.Compare(Integer.parseInt(inputEditText1.getText().toString(), Integer.parseInt(inputEditText2.getText().toString(
15、); allResult = calculatorService.Compute(Integer.parseInt(inputEditText1.getText().toString(), Integer.parseInt(inputEditText2.getText().toString(); catch (NumberFormatException e) / TODO Auto-generated catch block e.printStackTrace(); catch (RemoteException e) / TODO Auto-generated catch block e.pr
16、intStackTrace(); msg = 最大值为:+ String.valueOf(result) + n; msg += 和为: + String.valueOf(allResult.AddResult) + n; msg += 差为: + String.valueOf(allResult.SubResult) + n; msg += 积为: + String.valueOf(allResult.MulResult) + n; msg += 商为: + String.valueOf(allResult.DivResult) + n; resultTextView.setText(msg
17、); 源代码如下:CalculatorActivity中代码如下:package edu.tjut.cs.calculator;import edu.tjut.cs.RemoteCalculatorService.IRemoteCalculatorService;import edu.tjut.cs.RemoteCalculatorService.AllResult;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.cont
18、ent.Intent;import android.content.ServiceConnection;import .Uri;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.widget.*;public class CalculatorActivity extends Activity /*
19、Called when the activity is first created. */ private static TextView resultTextView = null; private static int input1, input2, result; /private CalculatorService calculatorService = null; private IRemoteCalculatorService calculatorService = null; private static Handler handler = new Handler(); publ
20、ic static void UpdateGUI(int firstValue, int secondValue, int res) input1 = firstValue; input2 = secondValue; result = res; handler.post(Refresh); private static Runnable Refresh = new Runnable() Override public void run() if(input1 = result) resultTextView.setText(String.valueOf(input1) + + String.
21、valueOf(input2); else resultTextView.setText(String.valueOf(input1) + + String.valueOf(input2); ; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); final EditText inputEditText1 = (EditText) findViewById(R.id.inputEditText01);
22、 final EditText inputEditText2 = (EditText) findViewById(R.id.inputEditText02); resultTextView = (TextView) findViewById(R.id.resultTextView); Button startServiceButton = (Button) findViewById(R.id.startServiceButton); Button stopServiceButton = (Button) findViewById(R.id.stopServiceButton); Button
23、compareButton = (Button) findViewById(RpareButton); final CheckBox modeCheckBox = (CheckBox) findViewById(R.id.modeCheckbox01); modeCheckBox.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub if(calculatorService != null) unbindServic
24、e(mConnection); calculatorService = null; ); startServiceButton.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub Intent intent = new Intent(); intent.setAction(edu.tjut.cs.RemoteCalculatorService); /*intent.setAction(edu.tjut.cs.Cal
25、culatorService); if(modeCheckBox.isChecked() intent.putExtra(MultiThread, true); else intent.putExtra(MultiThread, false);*/ Log.v(Test, -bindService is calledn); bindService(intent, mConnection, Context.BIND_AUTO_CREATE); ); stopServiceButton.setOnClickListener(new View.OnClickListener() Override p
26、ublic void onClick(View v) / TODO Auto-generated method stub unbindService(mConnection); calculatorService = null; ); compareButton.setOnClickListener(new View.OnClickListener() Override public void onClick(View v) / TODO Auto-generated method stub String msg = ; if(calculatorService = null) msg = 服
27、务尚未启动; resultTextView.setText(msg); else /int result = calculatorSpare(Integer.parseInt(inputEditText1.getText().toString(), Integer.parseInt(inputEditText2.getText().toString(); int result = 0; AllResult allResult = null; try result = calculatorService.Compare(Integer.parseInt(inputEditText1.getTex
28、t().toString(), Integer.parseInt(inputEditText2.getText().toString(); allResult = calculatorService.Compute(Integer.parseInt(inputEditText1.getText().toString(), Integer.parseInt(inputEditText2.getText().toString(); catch (NumberFormatException e) / TODO Auto-generated catch block e.printStackTrace(); catch (RemoteException e) / TODO Au
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2