实验三 本地服务.docx
《实验三 本地服务.docx》由会员分享,可在线阅读,更多相关《实验三 本地服务.docx(18页珍藏版)》请在冰豆网上搜索。
实验三本地服务
天津理工大学
计算机与通信工程学院
实验报告
2012至2013学年第二学期
实验三本地服务Service
课程名称
软件主流开发平台与工具
学号
学生姓名
年级
专业
教学班号
实验地点
实验时间
主讲教师
辅导教师
实验
(二)
实验名称
Service
软件环境
Windows
Ecllipse&AndroidSDK
硬件环境
PC
实验目的:
完成Android本地服务建立及绑定
完成Android应用程序建立及界面处理技术,包括以下内容:
●Android应用层程序建立
●本地服务定义及实现
●本地服务绑定及调用
●多线程使用
●Handler使用
实验内容(应包括实验题目、实验要求、实验任务等)
实验要求:
完成“Calcultor”功能
在已有程序框架及界面基础上,分步骤实现下述功能:
步骤一、
定义并实现一个简单的具备“计算功能“的服务组件,该组件仅有一个”比较“函数——输入两个整数,比较其中较大的做为返回值。
主界面上有一个“绑定服务”及“停止服务”按钮,单击“绑定服务”绑定新实现的服务;单击“停止服务”,停止绑定。
主界面另一个“比较”按钮,比较两个输入值,并将结果输出到主界面的TextView中
步骤二、
使用界面“CheckBox”控件,当控件被选中的情况下,绑定服务的行为与“步骤一”不同,具体为,创建一个新线程,该线程定时产生两个随机整数,并比较他们的大小。
同时将结果利用Handler反馈到主界面中
附:
安装apk:
adbinstall路径/Calculator.apk
实验过程与实验结果(可包括实验实施的步骤、算法描述、流程、结论等)
步骤一:
1.定义并实现一个简单的具备“计算功能“的服务组件,该组件仅有一个”比较“函数——输入两个整数,比较其中较大的做为返回值。
参照课本中P132页SimpleMathServiceDemo,课本中是实现两个数的相加:
publiclongAdd(longa,longb){returna+b;}
本实验是比较两个整数,将较大者作为返回值:
publicintcompare(inta,intb)
{
if(a>b)returna;
elsereturnb;
}
2.主界面上有一个“绑定服务”及“停止服务”按钮,单击“绑定服务”绑定新实现的服务;单击“停止服务”,停止绑定。
主界面另一个“比较”按钮,比较两个输入值,并将结果输出到主界面的TextView中
以绑定方式使用Service,能够获取到Service对象,不仅能够启动Service,而且能够调用正在运行中的Service实现的公有方法和属性。
为了使Service支持绑定,需要在Service类中重载onBind()方法,并在onBind()方法中返回Service对象。
当Service被绑定时,系统会调用onBind()函数,通过onBind()函数的返回值,将Service对象返回给调用者。
onBind()函数的返回值必须是符合IBinder接口,因此需要声明一个接口变量mBinder,mBinder符合onBind()函数返回值的要求,因此将mBinder传递给调用者。
IBinder是用于进程内部和进程间过程调用的轻量级接口,定义了与远程对象交互的抽象协议,使用时通过继承Binder的方法实现,即LocalBinder继承Binder的一个内部类,在代码中要实现getService()函数,当调用者获取到mBinder后,通过调用getService()即可获得到Service对象。
步骤二、
使用界面“CheckBox”控件,当控件被选中的情况下,绑定服务的行为与“步骤一”不同,具体为,创建一个新线程,该线程定时产生两个随机整数,并比较他们的大小。
同时将结果利用Handler反馈到主界面中
privateRunnablebackgroundWork=newRunnable(){
@Override
publicvoidrun()
{
try{
while(!
Thread.interrupted()){
intinput1=(int)(100*Math.random());
intinput2=(int)(100*Math.random());
intresult=(input1>input2)?
input1:
input2;
Thread.sleep(1000);
CalculatorActivity.UpdateGUI(input1,input2,result);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
};
布局的需要如下:
上面有三个按钮,分别为“启动服务”,“终止服务”,“比较”;
其下是一个“多线程”的CheckBox。
下面是一个TextView显示的是输入一个整数1,其右是一个EditText,用于输入第一个整数
下面是一个TextView显示的是输入一个整数2,其右是一个EditText,用于输入第二个整数
下面是一个TextView显示的是结果。
实验代码:
packageedu.tjut.cs.calculator;
importandroid.app.Activity;
importandroid.content.ComponentName;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.content.ServiceConnection;
import.Uri;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.IBinder;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.*;
publicclassCalculatorActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
privatestaticTextViewresultTextView=null;
privatestaticintinput1,input2,result;
privateCalculatorServicecalculatorService=null;
privatestaticHandlerhandler=newHandler();
publicstaticvoidUpdateGUI(intfirstValue,intsecondValue,intres)
{
input1=firstValue;
input2=secondValue;
result=res;
handler.post(Refresh);
}
privatestaticRunnableRefresh=newRunnable(){
@Override
publicvoidrun(){
if(input1==result)
resultTextView.setText(String.valueOf(input1)+">"+String.valueOf(input2));
else
resultTextView.setText(String.valueOf(input1)+"<"+String.valueOf(input2));
}
};
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
finalEditTextinputEditText1=(EditText)findViewById(R.id.inputEditText01);
finalEditTextinputEditText2=(EditText)findViewById(R.id.inputEditText02);
resultTextView=(TextView)findViewById(R.id.resultTextView);
ButtonstartServiceButton=(Button)findViewById(R.id.startServiceButton);
ButtonstopServiceButton=(Button)findViewById(R.id.stopServiceButton);
ButtoncompareButton=(Button)findViewById(RpareButton);
finalCheckBoxmodeCheckBox=(CheckBox)findViewById(R.id.modeCheckbox01);
modeCheckBox.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(calculatorService!
=null)
{
unbindService(mConnection);
calculatorService=null;
}
}
});
startServiceButton.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
Intentintent=newIntent();
intent.setAction("edu.tjut.cs.CalculatorService");
if(modeCheckBox.isChecked())
intent.putExtra("MultiThread",true);
else
intent.putExtra("MultiThread",false);
bindService(intent,mConnection,Context.BIND_AUTO_CREATE);
}
});
stopServiceButton.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(calculatorService!
=null||modeCheckBox.isChecked())
{
Log.v("XXXXXXXXXX","onBinderService:
");
unbindService(mConnection);
calculatorService=null;
}
}
});
compareButton.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
Stringmsg="";
if(calculatorService==null)
{
msg="服务尚未启动";
resultTextView.setText(msg);
}
else
{
intresult=calculatorSpare(Integer.parseInt(inputEditText1.getText().toString()),Integer.parseInt(inputEditText2.getText().toString()));
msg="最大值为:
"+String.valueOf(result);
resultTextView.setText(msg);
}
}
});
}
privateServiceConnectionmConnection=newServiceConnection(){
@Override
publicvoidonServiceConnected(ComponentNamearg0,IBinderarg1){
//TODOAuto-generatedmethodstub
calculatorService=((CalculatorService.LocalBinder)arg1).getService();
Log.v("XXXXXXXXXX","calculatorService:
"+String.valueOf(calculatorService));
}
@Override
publicvoidonServiceDisconnected(ComponentNamearg0){
//TODOAuto-generatedmethodstub
calculatorService=null;
}
};
}
CalculatorService.java
packageedu.tjut.cs.calculator;
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Binder;
importandroid.os.IBinder;
importandroid.util.Log;
publicclassCalculatorServiceextendsService{
privatefinalIBindermBinder=newLocalBinder();
privateThreadworkThread;
privatebooleanmultiThreadFlag=false;
@Override
publicvoidonCreate(){
//TODOAuto-generatedmethodstub
workThread=newThread(null,backgroundWork,"WorkThread");
super.onCreate();
}
publicclassLocalBinderextendsBinder{
CalculatorServicegetService(){
returnCalculatorService.this;
}
}
@Override
publicbooleanonUnbind(Intentintent){
//TODOAuto-generatedmethodstub
if(multiThreadFlag==true)
{
workThread.interrupt();
Log.v("XXXXXXXXXX","interrupted");
multiThreadFlag=false;
}
returnfalse;//super.onUnbind(intent);
}
@Override
publicIBinderonBind(Intentarg0){
//TODOAuto-generatedmethodstub
if(arg0.getBooleanExtra("MultiThread",false)==true)
{
workThread.start();
multiThreadFlag=true;
returnnull;
}
Log.v("XXXXXXXXXX","mBinder"+String.valueOf(mBinder));
returnmBinder;
}
publicintcompare(inta,intb)
{
if(a>b)returna;
elsereturnb;
}
privateRunnablebackgroundWork=newRunnable(){
@Override
publicvoidrun()
{
try{
while(!
Thread.interrupted()){
intinput1=(int)(100*Math.random());
intinput2=(int)(100*Math.random());
intresult=(input1>input2)?
input1:
input2;
Thread.sleep(1000);
CalculatorActivity.UpdateGUI(input1,input2,result);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
};
}
main.xml
xmlversion="1.0"encoding="utf-8"?
>
android="
android:
layout_width="fill_parent"
android:
layout_height="fill_parent"
android:
orientation="vertical">