1、 计算机学院实验中心----Android手机客户端 学生姓名:宋同煜 张宗森 指引教师:裴斐 专业:计算机科学与技术 102 在移动互联网发展迅猛今天,在Android完全开源及拥有庞大顾客群环境下,迫切需要为计算机学院实验中心网站开发Andriod手机客户端,以便计算机学院师生随时随处查看实验信息、登记实验等。 。 一、系统分析 需求分析 查询实验:教师及学生可以查询当周及上一
2、周、下一周实验安排 登记实验:教师登录后可以登记实验 引言 为以便计算机学院教师及学生查询、登记实验,因而开发实验中心Android手机端软件 编写目 本文档对计算机学院实验中心网站手机客户端功能、顾客界面、运营环境等作出详细阐明。 项目背景 软件开发名称:计算机学院实验中心 项目需求单位:计算机学院全体师生 项目开发单位:宋同煜 张宗森 二、系统设计 系统目的 1.实现需求分析阶段所有功能 2.主界面清晰、简朴、操作易行 系统功能预览 该软件重要涉及查询、登录、登记实验3个功能模块,重要操作如下: (1) 运营软件后,一方面检查网络连接与否正常,如果正常
3、获取当周实验安排信息,显示给顾客,效果如图 (2) 通过“菜单->登记实验”进入级别实验页面,规定输入顾客名密码才可继续 点击“登录实验” 后,提示登录后才干继续 (3)点击登录进入登录页面,如图 对的输入顾客名密码后点提交 (4)顾客名密码输入对的,就可以登记实验了,次页面包括实验名、课程名、班级、机房、第几大节、实验日期等信息填写,如图 (5)对的填写实验信息后,确认登记后点提交,返回登记成果 (6)登记成功后,重新打开软件即可看到刚才登记实验,如下图 (7)顾客登录后可保存、清除登录信息,不用每次使用都需要登录,并在软件主界
4、面右上角显示当前顾客名,效果如下图: 清除登录信息: 点击后弹出操作成果 (8)通过菜单->上周、下周进行上下周跳转查询, (9)检查更新、反馈等功能 软件每日启动都会检查与否存在新版本并提示顾客下载 反馈暂只通过短信方式反馈 (10)软件后台运营 因移动网络下蜗牛般网速,故提供后台运营功能,通过手机上返回键并没有真正退出而是后台运营了,对于手机网络较慢顾客(非Wifi下及3G顾客)是完全有必要,需要通过菜单里退出才干真正退出。 三、软件页头header某些设计 1.涉及软件名称,顾客登录状态,及提示信息 2.XML布局文献
5、ion="1.0" encoding="utf-8"?>
6、out_height="38.0dp"
android:background="#ff009de4" >
7、
android:layout_height="wrap_content"
android:background="#ff009de4" >
8、显示周一到周日实验信息
2. 某些XML布局文献
9、ger
…省略某些代码… >
10、别实验分别用一种Activity来解决。 每一种Activity均有onCreat()函数,用来生成窗口,本软件主Activity Cslab_listviewActivity.javaoncreatr()函数设计 1、设立布局文献 setContentView(R.layout.main); 2、获取系统日期时间 SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd"); SimpleDateFormat timef
11、 = new SimpleDateFormat ("yyyy年MM月dd日"); SimpleDateFormat weeknumber = new SimpleDateFormat ("EEE"); Date curDate = new Date(System.currentTimeMillis());//获取当前时间 String str = formatter.format(curDate); String week
12、numberString=weeknumber.format(curDate); zhouji=weeknumberString; time=timef.format(curDate); 3、检查网络状况,判断系统版本 initStrictMode();//判断系统版本,防止浮现NetworkOnMainThreadException 异常解决, if (!CheckNetwork()) { NetError(); return; } 4.从服务器获取当前
13、第几周 GetWeekNumber();保存到成员变量中。 采用多线程,避免ANR Thread t = new Thread() { @Override public void run() { 省略某些代码 } }; t.start(); //接受子线程消息 handler = new Han
14、dler() { @Override public void handleMessage(Message msg) { case 2: 省略某些代码 break; } } }; 5.依照周数获取实验信息private void getExperiment(final String week)并保存 String exper
15、iment=WebServiceResult(NAMESPACE,"Experiment",1,new String[]{"weeknumber"},new String[]{week}); JSONObject JsonExperiment = new JSONObject(experiment); ArrayExperiment=JsonExperiment.getJSONArray("ex"); 6.显示实验信息public boolean showexperiment() …………………… experimentlist1 = buildexperimen
16、tListForSimpleAdapter("星期一");//填充ListView数据 notes1 = new MyAdapter(this,experimentlist1,R.layout.experimentinfo, new String[] { "section","experiment"},new int[] { R.id.section, R.id.experimentinfo}); mListView1.setAdapter(notes1); mViews.add(mListV
17、iew1); ………………… 7.显示本周实验信息private void LoadThisweekExperiment() private void LoadExperiment(){ Thread Thnextweek = new Thread() { @Override public void run() { }}; Thnextweek.start(); nehandler = new Handler() { @Override public void h
18、andleMessage(Message msg) { switch (msg.what) { case 1: break; } }}; } 8.用变量记录程序运营时顾客上下周跳转导致周数变化,并用private void LoadExperiment() 显示实验信息 读取顾客保存账号信息private void getusernamefromsetting() service = new PreferencesSe
19、rvice(this);
Map
20、public class loginActivity extends Activity { private PreferencesService service; private static final String NAMESPACE = ""; //Webservice命名空间 private static String URL = ""; // WebService地址 String usernameString=""; String passwordString=""; EditText usernameEdit; EditText passwor
21、dEdit; Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); getusernamefromsetting(); usernameEdit=(EditText)findViewById(R.id.username_edit); password
22、Edit=(EditText)findViewById(R.id.password_edit); usernameEdit.setText(usernameString); passwordEdit.setText(passwordString); usernameEdit.addTextChangedListener(new TextWatcher() { 省略代码 }); passwordEdit.addTextChangedListener(new TextWatcher() {
23、 省略代码 }); Button login_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(){ @Override pub
24、lic void onClick(View arg0) { // TODO 自动生成办法存根 省略代码 } }); clear.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { 清除账号信息,省略代码 }}); login_button.setOnClickListene
25、r(new Button.OnClickListener() { @Override public void onClick(View v) { 验证输入与否对的,省略代码 else login(); } }); } private void login() { // TODO 自动生成办法存根 Thread t = new Thread() { @Override public void run() { 新线程 解决登录 }
26、}; t.start();// 启动线程 // 接受子线程消息 handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub switch (msg.what) { case 1: 解决登录成果,并提示顾客,省略代码 break; } } }; } //web服务调用函数 public Str
27、ing WebServiceResult(String ns,String method,int arg_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 28、me[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;
29、 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. 检查顾客与否登录,若登陆继续,否则返 30、回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 st 31、atic String URL = ""; // 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";
32、String classString="计科101";
String coursenameString="客户端测试";
EditText experimentname;
EditText experimentteacher;
EditText experimentclass;
EditText coursename;
Spinner number;
private PreferencesService service;
String usernameString="";
String passwordString="";
private Spi 33、nner roomSpinner;
private List 34、 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(R. 35、layout.editcourse);
/*获得TextView对象,并调用updateDisplay()来设立显示初始日期时间*/
//tv= (TextView) findViewById(R.id.showTime);
//updateDisplay();
/*获得DatePicker对象,以init() 设立初始值与onDateChangeListener() */
dp=(DatePicker)findViewById(R.id.dPicker);
dp. 36、init(mYear,mMonth,mDay,new DatePicker.OnDateChangedListener() {
@Override
public void onDateChanged(DatePicker view,int year,int monthOfYear,int dayOfMonth)
{
mYear=year;
mMonth= monthOfYear+1;
mDay=dayOfMonth; 37、 /*调用updateDisplay()来变化显示日期*/
time=""+mYear+"-"+mMonth+"-"+mDay;//updateDisplay();
}
});
experimentname=(EditText)findViewById(R.id.experimentname);
coursename=(EditText)findViewById(R.id.coursename);
number = (Spinner)find 38、ViewById(R.id.Spinner_number);
experimentteacher=(EditText)findViewById(R.id.editText_teacher);
experimentclass=(EditText)findViewById(R.id.editText_class);
experimentname.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
c 39、oursename.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
experimentclass.addTextChangedListener(new TextWatcher() {
………省略某些代码……………
});
numberlist.add("第一大节");
numberlist.add("第二大节");
numberlist.add("第三大节"); 40、
numberlist.add("第四大节");
numberlist.add("第五大节");
getTestRoom();
roomSpinner = (Spinner)findViewById(R.id.roomSpinner);
roomadapter = new ArrayAdapter 41、菜单样式。
roomadapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//第四步:将适配器添加到下拉列表上
roomSpinner.setAdapter(roomadapter);
//第五步:为下拉列表设立各种事件响应,这个事响应菜单被选中
roomSpinner.setOnItemSelectedListener(new Spinner.On 42、ItemSelectedListener(){
@SuppressWarnings("unchecked")
public void onItemSelected(AdapterView arg0,View arg1,int arg2,long arg3) {
………省略某些代码……………
});
numberadapter = new ArrayAdapter 43、nner_item,numberlist);
………省略某些代码……………
Button button_cancel=(Button)findViewById(R.id.button_cancel);
button_cancel.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Button butt 44、on_save=(Button)findViewById(R.id.button_save);
button_save.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(addexperiment.this)
.setTitle("确认登记")
.setMessage("时间:"+time+"\n"+
"节次:"+numb 45、erstring+"\n"+
"课程名:"+name+"\n"+
"实验名:"+coursenameString+"\n"+
"教师:"+teacher+"\n"+
"机房:"+room+"\n"+
"班级:"+classString
)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("拟定",new DialogInterface.OnClickListe 46、ner()
{
public void onClick(DialogInterface dialog,
int whichButton)
{
// 编写解决提交实验代码
}})
.setNegativeButton("取消", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,
int whichButton)
{
fi 47、nish();// 取消
} }) .show();
}
});
}
private void getTestRoom() {
// TODO 获取机房信息
Thread roomExperiment = new Thread() {
@Override
public void run() {
多线程解决,避免ANR,………省略某些代码……………
}};
roomExperiment.start();
handler = new 48、Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
解决登记实验返回成果 ………省略某些代码……………
}
}};
}
private void checklogin() {
getusernamefromsetting();
// 检查与否登录
if(usern 49、ameString.isEmpty()) {
new AlertDialog.Builder(addexperiment.this)
.setTitle("提示")
.setMessage("请登陆,再继续!"
)
.setIcon(android.R.drawable.ic_dialog_info)
.setPositiveButton("登录",new DialogInterface.OnClickListener()
{
public void onClick(Di 50、alogInterface dialog,
int whichButton)
{
finish();
Intent loginIntent=new Intent();
loginIntent.setClass(addexperiment.this,loginActivity.class);
startActivity(loginIntent);
//finish();
// 编写解决shi代码
}}).setNegativeButton("返






