实验三 本地服务.docx

上传人:b****7 文档编号:9276843 上传时间:2023-02-04 格式:DOCX 页数:18 大小:212.96KB
下载 相关 举报
实验三 本地服务.docx_第1页
第1页 / 共18页
实验三 本地服务.docx_第2页
第2页 / 共18页
实验三 本地服务.docx_第3页
第3页 / 共18页
实验三 本地服务.docx_第4页
第4页 / 共18页
实验三 本地服务.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验三 本地服务.docx

《实验三 本地服务.docx》由会员分享,可在线阅读,更多相关《实验三 本地服务.docx(18页珍藏版)》请在冰豆网上搜索。

实验三 本地服务.docx

实验三本地服务

天津理工大学

计算机与通信工程学院

 

实验报告

 

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">

android:

id="@+id/startServiceButton"

android:

layout_width="wrap_content"

android:

layout_height="50dip"

android:

text="启动服务"/>

android:

id="@+id/stopServiceButton"

android:

layout_width="wrap_content"

android:

layout_height="50dip"

android:

layout_toRightOf="@id/startServiceButton"

android:

text="终止服务"/>

android:

id="@+id/compareButton"

android:

layout_width="wrap_content"

android:

layout_height="50dip"

android:

layout_toRightOf="@id/stopServiceButton"

android:

text="比较"/>

android:

id="@+id/modeCheckbox01"

android:

layout_below="@id/startServiceButton"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

layout_alignParentLeft="true"

android:

text="多线程"/>

android:

id="@+id/inputTextView01"

android:

layout_width="wrap_content"

android:

layout_height="50dip"

android:

layout_below="@id/modeCheckbox01"

android:

layout_marginTop="10dip"

android:

text="输入一个整数1"/>

android:

id="@+id/inputTextView02"

android:

layout_width="wrap_content"

android:

layout_height="50dip"

android:

layout_below="@id/inputTextView01"

android:

text="输入一个整数2"/>

android:

id="@+id/inputEditText01"

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1