当前位置:文档之家› 软件详细设计报告

软件详细设计报告

计算机学院实验中心----Android手机客户端学生姓名:宋同煜张宗森指导老师:***专业:计算机科学与技术102在移动互联网发展迅猛的今天,在Android完全开源及拥有庞大用户群的环境下,迫切需要为计算机学院实验中心网站开发Andriod手机客户端,方便计算机学院师生随时随地查看实验信息、登记实验等。

一、系统分析需求分析查询实验:教师及学生可以查询当周及上一周、下一周实验安排登记实验:教师登录后可以登记实验引言为方便计算机学院教师及学生查询、登记实验,因此开发实验中心Android手机端软件编写目的本文档对计算机学院实验中心网站手机客户端的功能、用户界面、运行环境等作出详细说明。

项目背景软件的开发名称:计算机学院实验中心项目需求单位:计算机学院全体师生项目开发单位:宋同煜张宗森二、系统设计系统目标1.实现需求分析阶段的所有功能2.主界面清晰、简单、操作易行系统功能预览该软件主要包括查询、登录、登记实验3个功能模块,主要操作如下:(1)运行软件后,首先检查网络连接是否正常,如果正常,获取当周实验安排信息,显示给用户,效果如图(2)通过“菜单->登记实验”进入等级实验页面,要求输入用户名密码才可继续点击“登录实验”后,提示登录后才能继续(3)点击登录进入登录页面,如图正确输入用户名密码后点提交(4)用户名密码输入正确,就可以登记实验了,次页面包含实验名、课程名、班级、机房、第几大节、实验日期等信息的填写,如图(5)正确填写实验信息后,确认登记后点提交,返回登记结果(6)登记成功后,重新打开软件即可看到刚才登记的实验,如下图(7)用户登录后可保存、清除登录信息,不用每次使用都需要登录,并在软件主界面右上角显示当前用户名,效果如下图:清除登录信息:点击后弹出操作结果(8)通过菜单->上周、下周进行上下周跳转查询,(9)检查更新、反馈等功能软件每日启动都会检查是否存在新版本并提示用户下载反馈暂只通过短信方式反馈(10)软件后台运行因移动网络下蜗牛般的网速,故提供后台运行功能,通过手机上的返回键并没有真正退出而是后台运行了,对于手机网络较慢的用户(非Wifi下及3G用户)是完全有必要的,需要通过菜单里的退出才能真正退出。

三、软件页头header部分设计1.包括软件名称,用户登录状态,及提示信息2.XML布局文件<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ff009de4"android:orientation="vertical"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="38.0dp"android:background="#ff009de4"><ImageView…省略部分代码…/><TextView…省略部分代码…/><TextView…省略部分代码…/><Button…省略部分代码…/><ImageView…省略部分代码…/></RelativeLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#ff009de4"><TextView…省略部分代码…android:text="获取网络数据中..."/>--></RelativeLayout></LinearLayout>四、软件主显示部分设计1.采用Viewpager+Listview 实现滑动显示周一到周日实验信息2.部分XML布局文件<?xml version="1.0"encoding="utf-8"?><LinearLayout…省略部分代码…><!--标题--><LinearLayout…省略部分代码…><include…省略部分代码…layout="@layout/header"/></LinearLayout><!--滑动--><LinearLayout…省略部分代码…><android.support.v4.view.ViewPager…省略部分代码…><android.support.v4.view.PagerTitleStrip…省略部分代码…/></android.support.v4.view.ViewPager></LinearLayout><!--滑动结束--></LinearLayout>五、主Activity设计Cslab_listviewActivity.java1.onCreate()窗口生成函数Android 软件运行后首先运行主Activity,一个Activity代表一个窗口(一个类)软件的登录及等级实验分别用一个Activity来处理。

每一个Activity都有onCreat()函数,用来生成窗口,本软件的主ActivityCslab_listviewActivity.java的oncreatr()函数设计1、设置布局文件setContentView(yout.main);2、获取系统日期时间SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd");SimpleDateFormat timef = new SimpleDateFormat ("yyyy年MM月dd日");SimpleDateFormat weeknumber = new SimpleDateFormat ("EEE");Date curDate = new Date(System.currentTimeMillis());//获取当前时间String str = formatter.format(curDate);String weeknumberString=weeknumber.format(curDate);zhouji=weeknumberString;time=timef.format(curDate);3、检查网络情况,判断系统版本initStrictMode();//判断系统版本,防止出现NetworkOnMainThreadException 异常处理,if (!CheckNetwork()) {NetError();return;}4.从服务器获取当前第几周 GetWeekNumber(); 保存到成员变量中。

采用多线程,避免ANRThread t = new Thread() {@Overridepublic void run() {省略部分代码}};t.start();//接收子线程消息handler = new Handler() {@Overridepublic void handleMessage(Message msg) {case 2:省略部分代码break;}}};5.根据周数获取实验信息private void getExperiment(final String week)并保存String experiment=WebServiceResult(NAMESPACE,"Experiment",1,newString[]{"weeknumber"},new String[]{week});JSONObject JsonExperiment = new JSONObject(experiment);ArrayExperiment=JsonExperiment.getJSONArray("ex");6.显示实验信息public boolean showexperiment()……………………experimentlist1 = buildexperimentListForSimpleAdapter("星期一");//填充ListView的数据notes1 = new MyAdapter(this, experimentlist1,yout.experimentinfo,new String[] { "section", "experiment"}, new int[] { R.id.section, R.id.experimentinfo});mListView1.setAdapter(notes1);m Views.add(mListView1);…………………7.显示本周实验信息private void LoadThisweekExperiment()private void LoadExperiment(){Thread Thnextweek = new Thread() {@Overridepublic void run() {}};Thnextweek.start();nehandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:break;}}};}8.用变量记录程序运行时用户上下周跳转导致的周数变化,并用private void LoadExperiment() 显示实验信息读取用户保存的账号信息private void getusernamefromsetting() service = new PreferencesService(this);Map<String, String> params = service.getUsername();usernameString=params.get("username");9.其他……………………………六、登录模块设计loginActivity.java1.用户名密码输入EditText usernameEdit;EditText passwordEdit;2.处理登录请求,提交给Webservice服务器,并返回登录结果成功或失败privatevoid login()3.返回主界面public class loginActivity extends Activity {private PreferencesService service;private static final String NAMESPACE= "/"; //Webservice命名空间private static String URL ="/lab/lab.asmx"; // WebService地址String usernameString="";String passwordString="";EditText usernameEdit;EditText passwordEdit;Handler handler;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.login);getusernamefromsetting();usernameEdit=(EditText)findViewById(ername_edit);passwordEdit=(EditText)findViewById(R.id.password_edit);usernameEdit.setText(usernameString);passwordEdit.setText(passwordString);usernameEdit.addTextChangedListener(new TextWatcher() {省略代码});passwordEdit.addTextChangedListener(new TextWatcher() {省略代码});Buttonlogin_button=(Button)findViewById(R.id.signin_button);Button clear=(Button)findViewById(R.id.clear);Button Button01=(Button)findViewById(R.id.Button01);Button01.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO自动生成的方法存根省略代码}});clear.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {清除账号信息,省略代码}});login_button.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {验证输入是否正确,省略代码else login();}});}private void login() {// TODO自动生成的方法存根Thread t = new Thread() {@Overridepublic void run() {新线程处理登录}};t.start();// 启动线程// 接收子线程消息handler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.what) {case 1:处理登录结果,并提示用户,省略代码break;}}};}//web服务调用的函数public String WebServiceResult(String ns,String method,intarg_number,String[] arg_name,String[] arg_value){String re =arg_name[0]+arg_value[0];try {SoapObject rpc = new SoapObject(ns, method);if (arg_number != 0){for (int i=0;i<arg_number;i++)rpc.addProperty(arg_name[i].toString(),arg_value[i].toString());}AndroidHttpTransport ht = new AndroidHttpTransport(URL);ht.debug = true;SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.bodyOut = rpc;envelope.dotNet = true;envelope.setOutputSoapObject(rpc);ht.call(ns + method, envelope);SoapObject result = (SoapObject) envelope.bodyIn;re = result.getProperty(0).toString();} catch (Exception e) {e.printStackTrace();}return re;}七、登记实验模块设计:1.检查用户是否登录,若登陆继续,否则返回private void checklogin() {2.文本输入框(EditView)、列表选择框(spanner)、日期控件设置3.从服务器获取机房信息private void getTestRoom() {4.提交实验信息并返回处理结果给用户private void subExperiment()5.返回主界面public class addexperiment extends Activity {private static final String NAMESPACE= "/"; //Webservice命名空间private static String URL ="/lab/lab.asmx"; // WebService地址Handler handler;private int mYear;private int mMonth;private int mDay;DatePicker dp;String username="";String password="";String room="";String time="";String name="客户端测试";String numberstring="";String teacher="test";String classString="计科101";String coursenameString="客户端测试";EditText experimentname;EditText experimentteacher;EditText experimentclass;EditText coursename;Spinner number;private PreferencesService service;String usernameString="";String passwordString="";private Spinner roomSpinner;private List<String> list = new ArrayList<String>();private List<String> numberlist = new ArrayList<String>();private ArrayAdapter<String> roomadapter;private ArrayAdapter<String> numberadapter;@Overridepublic void onCreate(Bundle savedInstanceState) {checklogin();Calendar c=Calendar.getInstance();mYear=c.get(Calendar.YEAR);mMonth=c.get(Calendar.MONTH);mDay=c.get(Calendar.DAY_OF_MONTH);time=""+mYear+"-"+(mMonth+1)+"-"+mDay;super.onCreate(savedInstanceState);setContentView(yout.editcourse);/*取得TextView对象,并调用updateDisplay()来设置显示的初始日期时间*///tv= (TextView) findViewById(R.id.showTime);//updateDisplay();/*取得DatePicker对象,以init() 设置初始值与onDateChangeListener() */dp=(DatePicker)findViewById(R.id.dPicker);dp.init(mYear,mMonth,mDay,new DatePicker.OnDateChangedListener() {@Overridepublic void onDateChanged(DatePicker view,int year, int monthOfYear,int dayOfMonth){mYear=year;mMonth= monthOfYear+1;mDay=dayOfMonth; /*调用updateDisplay()来改变显示日期*/time=""+mYear+"-"+mMonth+"-"+mDay;//updateDisplay();}});experimentname=(EditText)findViewById(R.id.experimentname);coursename=(EditText)findViewById(R.id.coursename);number = (Spinner)findViewById(R.id.Spinner_number);experimentteacher=(EditText)findViewById(R.id.editText_teacher);experimentclass=(EditText)findViewById(R.id.editText_class);experimentname.addTextChangedListener(new TextWatcher() { ………省略部分代码……………});coursename.addTextChangedListener(new TextWatcher() {………省略部分代码……………});experimentclass.addTextChangedListener(new TextWatcher() {………省略部分代码……………});numberlist.add("第一大节");numberlist.add("第二大节");numberlist.add("第三大节");numberlist.add("第四大节");numberlist.add("第五大节");getTestRoom();roomSpinner = (Spinner)findViewById(R.id.roomSpinner);roomadapter = newArrayAdapter<String>(this,yout.simple_spinner_item, list);//第三步:为适配器设置下拉列表下拉时的菜单样式。

相关主题