ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:295.36KB ,
资源ID:1079074      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-1079074.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验四 远程服务.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

实验四 远程服务.docx

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