
课程设计成果
学院:计算机工程学院 班 级:11级计算机科学与技术本科3班
学生姓名: 王能 学 号:2011404010327
设计地点:(单位)A5—201
设计题目:手机通讯录系统
完成日期:2013年 6月 20日
指导教师评语:
成绩(五级记分制):
教师签名:
目 录
1 前言 1
2 系统概述 2
2.1 需求分析 2
2.1.1 基本功能需求 2
2.1.2 系统用例分析 2
2.2 总体设计方案 5
2.2.1 系统模块关系与划分 5
3 系统详细分析 6
3.1 通讯录需求分析 6
3.1.1 增加、删除、编辑联系人 6
3.1.2 查找联系人 6
3.1.3 通讯功能 6
3.1.4 菜单功能 7
3.1.5 导入导出功能 7
3.2 数据库设计 7
3.1.3 Android数据库概述 7
3.1.3 数据库表详细设计 7
3.3 系统界面设计 8
4 系统编码实现 14
5 测试 19
6 参考文献 23
前 言
随着移动通信与Internet向移动终端的普及,网络和用户对移动终端的要求越来越高,而Symbian,Windows Mobile,PalmOS等手机平台过于封闭,不能很好的满足用户的需求,因此市场迫切需要一个开发性很强的平台。经过多年的发展,第三代数字通信(3G)技术活动了广泛的接受,它为移动终端用户带来了更快的数据传输速率。随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。Google为此与2007年11月推出了一个专为移动设备设计的软件平台——Android。
Android 是一套真正意义上的开发性的移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android 是由Linux+Java构成的开源软件,允许所有厂商和个人在其基础上进行开发。Android平台的开放性等特点既能促进技术(包括平台本身)的创新,又有助于降低开发成本,还可以是运营商能非常方便地制定自己的特色化的产品。因此,它具有很大的市场发展潜力。
Android(Google公司)是Google开发的基于Linux平台的开源手机操作系统。它包括操作系统、用户界面和应用程序 ——移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍。谷歌与开放手机联盟合作开发了 Android,这个联盟由包括中国移动、摩托罗拉、高通、宏达和 T-Mobile 在内的 30 多家技术和无线应用的领军企业组成。
(1)优点:具备触摸屏、高级图形显示和上网功能,界面强大,可以说是一种
融入全部Web应用的单一平台
(2)缺点:由于时时刻刻都需要和网络进行连接,因此在手机的能耗方面控制就较差,导致待机能力不足;又由于其开源性,过分依赖开发商,缺少标准配置。
第1章 系统概述
需求分析
基本功能需求
(1) 用户通过联系人功能可以保存联系人的详细信息,可以对联系人进行编辑、删除、拨打电话、发送短信可以根据索引条件搜索联系人。
(2) 用户通过短信记录功能可以发送短信,删除短信记录。
(3) 用户通过SD卡所储存信息向通讯录批量导入联系人信息。
(4) 用户通过个人中心可以设置自己的详细信息,这样方便其他人了解自己,也可以将具有相同名字的联系人合并。
系统用例分析
图1-1显示了通话记录功能模块。包括了联系人详细信息查看,清空通话记录,在选择一个条目后,可以对其进行拨打电话,发送短信功能的操作,也可以进行删除。
手机用户
图1-1 通话记录模块用例图
图1-2显示了联系人功能模块的用例。包括了查看联系人详细信息,编辑联系人信息,新建联系人,对选中的联系人,可以对其进行删除、拨打电话、发送短信的操作。用户还可以进行联系人搜索,这样方便用户快速找到想找的联系人信息。
图1-2 电话薄模块用例图
图1-3为个人中心模块中设置个人详细信息子模块的用例。该模块的功能就是用户设置自己的个人基本信息。
手机用户
图1-3 设置个人信息模块用例图
图1-4显示了联系人导入导出的用例图。该模块的功能就是联系人的导入与导出。
图1-4 联系人导入导出
总体设计方案
系统模块关系与划分
一个好的系统设计的步骤决定了程序是否能按照设计者的目的按时完成,是否能在规定的时间内按照设计者的要求高质量的完成程序必要的功能。并且按照标准的设计步骤对程序进行调试,测试,以及后期的优化完善,使程序更加具有健壮性和可用性。通过对通讯录功能、系统模块、用户需求方面进行全方位的分析制定开发流程。
采用标准的开发流程确定系统具有用户管理功能,联系人增删改功能,通讯功能,查找功能,备份等功能。
图1-5 系统功能图
通过对系统的功能结构的分析,设计后系统运行流程是系统运行后用户将进入通讯录主界面,可以看到联系人,增加联系人。通过点击MENU界面的增加功能选项可以新增联系人,通过查找按钮可以对联系人进行姓名、号码的操作,通过选择联系人并点击删除键可以对联系人进行删除操作,通过菜单功能可以显示所有联系人、删除所有联系人、并备份SD卡功能。在联系人详细信息界面点击MENU键弹出通讯功能框选择拨打电话按钮或者发信息发邮件按键,系统的运行流程图如1-6所示。
图1-6 系统运行流程
第2章 系统详细设计
2.1通讯录需求分析
根据手机功能调查显示,近十成消费者都会使用手机通讯录功能,随着手机通讯录功能的不断加强与完善,手机通讯录的意义,已不仅仅像电话薄一样显示电话号码,而是向着个性化、人性化的方向发展。通讯录从无到有,从英文到中文,经历了十几年的发展历程,今后的发展趋势就是从通讯录发展为名片夹,也就是在一个联系人之下有手机号码、固话号码、公司、住址、邮箱、备注等内容。手机通讯录扮演着与用户直接交互并且提供服务的重要角色,它需要提供良好的用户体验,方便用户操作,接收用户的操作并把这些操作转换成相应的命令,采用用户活动的方式完成各个服务的逻辑流程。其功能主要包括增加、删除、编辑联系人,查找联系人,通讯功能,菜单功能,导入导出功能。
2.1.1增加、删除、编辑联系人
点击通信录界面中的增加按钮,进入增加联系人界面。输入联系人的基本信息,并可根据用户需求增加个性化信息如头像、姓名、手机号码、办公室电话、家庭电话、职务职称、单位名称、地址、邮政编码、Email、其他联系方式、备注这些信息,单击确认返回主界面。点击通信录中一个已存在的联系人,进入联系人编辑界面,可修改联系人的资料或进行删除联系人操作,完成后退回到主界面。对列表中联系人的标记,点击menu键弹出功能界面上的删除按键也可进行删除。还可以在菜单上选择删除全部联系人来清空通讯录。在删除联系人的过程中,系统将提示用户是否继续操作,若放弃操作,则联系人信息将继续保存。
2.1.2查找联系人
用户点击menu键打开底部菜单框,底部菜单框为查询联系人提供入口,进入通讯录的缺省页面为联系人列表,在列表中看到所有联系人的姓名、电话信息排列,用户点击查找按键输入联系人基本信息,通讯录显示所有符合查询条件的联系人列表,用户选择一个联系人进入联系人基本信息页面进行其他操作;查询完成,用户按返回键返回主界面。
2.1.3通讯功能
用户在通讯录选择联系人进入联系人详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息还是发邮件的功能进行操作。
2.1.4菜单功能
通过对menu按键的点击,显示底部菜单框,包含有增加、查找、删除、菜单、返回功能,菜单按键则包含显示所有、删除所有、备份SD卡等实用功能。
2.1.5导入、导出功能
基本流:用户点击菜单进入导入导出界面,点击导出手机通信录出现文件系统选择保存路径,选择并且点击导出后在指定目录生成包含通信录信息的Excel文件,显示“通信录导出成功”并且返回至导入导出界面。点击导入手机通信录出现文件系统选择需要导入的Excel文件,选中文件点击导入后将信息添加至手机通信录,显示导入成功并返回导入导出界面。
备选流: 点击进入导入导出界面,点击返回则返回软件主界面。导出文件时存储卡空间不足,则提示错误并返回导出界面。导入文件时打开无法识别的文件提示错误,返回导入文件界面。
2.2数据库设计
2.2.1Android数据库概述
Android自带了SQLite数据库,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
关于Sqlite的数据类型,你会惊讶:Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么. 对于SQLite来说对字段不指定类型是完全有效的。
2.2.2数据库表详细设计
对系统所需功能需求分析通过了设计确定了系统数据库中表的设计,该系统有一张表电话薄表,下面为表的详细设计。
表user:
| 字段名 | 类型 | 是否可为空 | 是否为主键 | 描述 |
| Name | String | 否 | 否 | 用户名 |
| String | 是 | 否 | 电子邮箱 | |
| Phone | int | 否 | 是 | 联系电话 |
| String | 是 | 否 | QQ号码 | |
| Company | String | 是 | 否 | 公司 |
| Birthday | Date | 是 | 否 | 生日 |
2.3.1界面布局
Android的资源文件保存在/res的子目录中。其中/res/drawable/目录中保存的是图像文件,/res/values目录中保存的是用来自定义字符串和颜色的文件,/res/xml目录中保存的是XML格式的数据文件。所有在程序开发阶段可以被调用的资源都保存在这些目录中,在对界面进行绘制时要考虑到不同手机屏幕大小可能不一样,应尽量兼容大多数手机屏幕尺寸,使之显示无障碍。增加界面绘制代码如下:
android:layout_height="fill_parent" android:background="@drawable/cbg">
2.3.2增加联系人功能
在通讯录中最主要的功能操作,也就是联系人的添加操作的功能,在联系人增加界面中点击保存按钮实现对联系人信息的保存。首先在user类中定义了一个user函数从表单中获取数据,建立数据库帮助类,打开数据库并将user保存到数据库中,增加界面如图2-1所示。
图2-1 增加联系人界面
2.3.3删除联系人功能
通过光标选择删除的联系人,点击联系人然后选择删除可以删除联系人,并且在数据库中删除联系人,删除联系人功能如图2-2所示
2.3.4查找联系人功能
在查找功能实现的过程中,我先将搜索框中的内容转化为字符串形式,如果输入为空就设置显示所有联系人的列表,否则就建立一个数据库帮且类,在数据库中进行查找匹配,返回到list列表中,将整合的adapter和listview结合展现出来,并统计查找到的条数展现给用户。
2.3.5 Menu底部菜单框功能
下面我们将介绍menu的触发方式,通过对menu的介绍,我们将了解menu功能设计,对menu键的使用首先要建立menu菜单,为每个菜单选项绑定了一个图标和文字,代码如下底部菜单如图2-3所示。
2.3.6 通信功能
下面的程序定义了用户打电话,发邮件,发短信的功能,如下的代码主要是运用了android操作系统自定义接口,运用这些接口可以实现用户的打电话、发短信、发邮件的功能。
public class SendMessage extends Activity {
private TextView nameText = null;
private EditText myEditText = null;
private EditText EditText2 = null;
private Button myButton = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sentmassage);
Intent intent = getIntent();
String phone_num = intent.getStringExtra("phone_num");
String name =intent.getStringExtra("name");
System.out.println("----传过来的短信号码----: " + phone_num);
System.out.println("----传过来的名字----: " + name);
nameText = (TextView) findViewById(R.id.nameText);
myButton=(Button)findViewById(R.id.sent_button);
myEditText=(EditText)findViewById(R.id.phone_edit);
EditText2=(EditText)findViewById(R.id.text_edit);
nameText.setText(name + ": "); //将名字显示
myEditText.setText(phone_num); //将号码填上
myButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String mobile=myEditText.getText().toString();
String content=EditText2.getText().toString();
SmsManager sms=SmsManager.getDefault();
PendingIntent sentintent =PendingIntent.getBroadcast(SendMessage.this, 0, new Intent(), 0);
try {
if(content.length()>70) {
List for(String msg:msgs) { sms.sendTextMessage(mobile, null, msg, sentintent, null); Toast.makeText(SendMessage.this, "短信正在发送", 2).show(); } } else{ sms.sendTextMessage(mobile, null, content, sentintent, null); } } catch (Exception e) { e.printStackTrace(); } Toast.makeText(SendMessage.this, "短信发送成功", 2).show(); } }); } 2.3.8数据库操作实现 为了实现联系人在数据库中的增加,删除,查找等操作,使用操作数据库的核心类android.database.sqlite.SQLiteDatabase。使用SQLiteOpenHelper的子类来完成创建、打开数据库及各种对数据库的操作。数据库的类继承函数,显示了数据库类的继承关系: package ahpu.wang.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; //DatabaseHelper作为一个访问SQLite的助手类,提供两个方面的功能, //第一,getReadableDatabase(),getWritableDatabase()可以获得SQLiteDatabse对象,通过该对象可以对数据库进行操作 //第二,提供了onCreate()和onUpgrade()两个回调函数,允许我们在创建和升级数据库时,进行自己的操作 public class DatabaseHelper extends SQLiteOpenHelper { private static final int VERSION = 1; //在SQLiteOepnHelper的子类当中,必须有该构造函数 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { //必须通过super调用父类当中的构造函数 super(context, name, factory, version); } public DatabaseHelper(Context context,String name){ this(context,name,VERSION); } public DatabaseHelper(Context context,String name,int version){ this(context, name,null,version); } //该函数是在第一次创建数据库的时候执行,实际上是在第一次得到SQLiteDatabse对象的时候,才会调用这个方法 public void onCreate(SQLiteDatabase db) { System.out.println("create a Database"); //execSQL函数用于执行SQL语句 db.execSQL("create table user(name varchar(20),phone text,qq text,mail text,address text)"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("update a Database"); } } 第3章 系统编码实现 3.1系统功能的实现代码 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imagebutton1 = (ImageButton) findViewById(R.id.imagebutton1); imagebutton2 = (ImageButton) findViewById(R.id.imagebutton2); imagebutton3 = (ImageButton) findViewById(R.id.imagebutton3); imagebutton1.setOnClickListener(new MyOnClickListener()); imagebutton2.setOnClickListener(new MyOnClickListener()); imagebutton3.setOnClickListener(new MyOnClickListener()); } class MyOnClickListener implements OnClickListener { public void onClick(View v) { switch(v.getId()) { case R.id.imagebutton1: //直接跳转到联系人列表 Intent intent1 = new Intent(); intent1.putExtra("Search_flag", 0); intent1.setClass(MainActivity.this,Address_Book.class); startActivity(intent1); break; case R.id.imagebutton2: //跳到查找联系人对话框,传个标志Search_flag到列 Intent intent2 = new Intent(); intent2.putExtra("Search_flag", 1); intent2.setClass(MainActivity.this,Address_Book.class); startActivity(intent2); break; case R.id.imagebutton3: //跳转到增加联系人页面 Intent intent3 = new Intent(MainActivity.this,Add_people.class); startActivity(intent3); break; default: break; } } } } public class Add_people extends Activity { private EditText editName = null; private EditText editPhone = null; private EditText editQQ = null; private EditText editEmail = null; private EditText editAddress = null; private Button buttonAdd = null; private Button buttonCancel = null; public static int n ; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.second); editName = (EditText) findViewById(R.id.edit_name); editPhone = (EditText) findViewById(R.id.edit_phone); editQQ = (EditText) findViewById(R.id.edit_QQ); editEmail = (EditText) findViewById(R.id.edit_mail); editAddress = (EditText) findViewById(R.id.edit_address); buttonAdd = (Button) findViewById(R.id.button1_add); buttonCancel= (Button) findViewById(R.id.button2_cancel); Intent intent = getIntent(); //接收上一个Activity通过intent传过来的数据 } buttonAdd.setOnClickListener(new MyButtonOnClickListener()); buttonCancel.setOnClickListener(new MyButtonOnClickListener()); } class MyButtonOnClickListener implements OnClickListener { private static final int REQUESCODE2 = 2; public void onClick(View v) { switch(v.getId()) { case R.id.button1_add: //--------------------确定添加此联系人 if(editName.getText().toString().length()>0 & editPhone.getText().toString().length()>=3 ) { CreateDatabaseHelper(); //创建数据库,将联系人信息保存到 if(n != 1) { //新建联系人,若是修改联系人则不会再添 Address_Book.LIST = Insert(); //返回全部数据给LIST静 Toast.makeText(Add_people.this, "添加成功", 1).show(); System.out.println(".......选择新建联系人"); }else if(n == 1) { //修改联系人(n:是点击了修改联系人后传进 Address_Book.LIST = modfiy(); //返回全部数据给LIST Toast.makeText(Add_people.this, "修改成功", 1).show(); System.out.println(".......选择修改联系人"); } Intent intent = new Intent(); intent.setClass(Add_people.this,Address_Book.class); intent.putExtra("nothing2", 2); startActivityForResult(intent, REQUESCODE2); }else if(editName.getText().toString().equals("")){ //没有输入名字不 Toast.makeText(Add_people.this, "请输入联系人姓名", 1).show(); }else if( editPhone.getText().toString().length()<3 ) { //电话无效不能 Toast.makeText(Add_people.this, "请输入有效电话", 1).show(); } break; case R.id.button2_cancel: //------------------取消此联系人的添加回到列表界面 Toast.makeText(Add_people.this, "取消", 1).show(); Intent intent = new Intent(Add_people.this,Address_Book.class); startActivity(intent); break; default: break; } } } public void CreateDatabaseHelper() { DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db"); SQLiteDatabase db = dbHelper.getReadableDatabase(); } public ArrayList Insert() { ContentValues values = new ContentValues(); values.put("name",editName.getText().toString()); values.put("phone",editPhone.getText().toString()); values.put("qq",editQQ.getText().toString()); values.put("mail",editEmail.getText().toString()); values.put("address",editAddress.getText().toString()); DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2); SQLiteDatabase db = dbHelper.getWritableDatabase(); db.insert("user", null, values); ArrayList DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db"); SQLiteDatabase db1 = dbHelper1.getReadableDatabase(); Cursor cursor = db1.query("user", new String[]{"name while(cursor.moveToNext()){ HashMap map.put("name", cursor.getString(cursor.getColumnIndex("name"))); map.put("phone", cursor.getString(cursor.getColumnIndex("phone"))); map.put("qq", cursor.getString(cursor.getColumnIndex("qq"))); map.put("mail", cursor.getString(cursor.getColumnIndex("mail"))); map.put("address", cursor.getString(cursor.getColumnIndex("address"))); } return list; //返回全部数据list用于列表显示 } public void Query(){ DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db"); SQLiteDatabase db = dbHelper.getReadableDatabase(); Cursor cursor = db.query("user", new String[]{"name while(cursor.moveToNext()){ String name1 = cursor.getString(cursor.getColumnIndex("name")); String name2 = cursor.getString(cursor.getColumnIndex("phone")); String name3 = cursor.getString(cursor.getColumnIndex("qq")); String name4 = cursor.getString(cursor.getColumnIndex("mail")); String name5 = cursor.getString(cursor.getColumnIndex("address")); System.out.println("query--->" + name1); System.out.println("query--->" + name2); System.out.println("query--->" + name3); System.out.println("query--->" + name4); System.out.println("query--->" + name5); System.out.println("=================================================="); } } public ArrayList modfiy(){ ContentValues values = new ContentValues(); values.put("name",editName.getText().toString()); values.put("phone",editPhone.getText().toString()); values.put("qq",editQQ.getText().toString()); values.put("mail",editEmail.getText().toString()); values.put("address",editAddress.getText().toString()); DatabaseHelper dbHelper = new DatabaseHelper(Add_people.this,"test_mars_db",2); SQLiteDatabase db = dbHelper.getWritableDatabase(); System.out.println("************修改联系人之前 : " + Address_Book.LIST.get(Address_Book.CLICK_ID).toString()); db.update("user", values, "name = ?", new String[]{Address_Book.LIST.get(Address_Book.CLICK_ID).get("name").toString()}); ArrayList DatabaseHelper dbHelper1 = new DatabaseHelper(Add_people.this,"test_mars_db"); SQLiteDatabase db1 = dbHelper1.getReadableDatabase(); Cursor cursor = db1.query("user", new String[]{"name while(cursor.moveToNext()){ HashMap map.put("name", cursor.getString(cursor.getColumnIndex("name"))); map.put("phone", cursor.getString(cursor.getColumnIndex("phone"))); map.put("qq", cursor.getString(cursor.getColumnIndex("qq"))); map.put("mail", cursor.getString(cursor.getColumnIndex("mail"))); map.put("address", cursor.getString(cursor.getColumnIndex("address"))); } return list; //返回全部数据list用于列表显示 } } DatabaseHelper.java package liu.sqlite3.db; public class DatabaseHelper extends SQLiteOpenHelper { private static final int VERSION = 1; //在SQLiteOepnHelper的子类当中,必须有该构造函数 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } public DatabaseHelper(Context context,String name){ this(context,name,VERSION); } public DatabaseHelper(Context context,String name,int version){ this(context, name,null,version); } public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub System.out.println("create a Database"); //execSQL函数用于执行SQL语句 db.execSQL("create table user(name varchar(20),phone text,qq text,mail text,address text)"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub System.out.println("update a Database"); } } 第4章 系统测试 4.1系统测试用例 系统测试就是利用测试工具按照测试方案和流程对产品进行功能和性能测试,根据需要编写不同的测试工具,设计和维护测试系统,对测试方案可能出现的问题进行分析。根据功能需求和性能需求制定以下测试用例,测试用例如表4-1所示。 表4-1 测试用例 2、跳转联系人列表界面 2、通过底部菜单删除键删除 3、对联系人进行标记 4、删除全部联系人 2、通过对号码和邮箱的识别进行相应的操作 查找联系人 删除联系人 导入功能 More 4.2.1系统测试方法 测试过程按4个步骤进行,即单元测试、集成测试、确认测试和系统测试及发版测试。 开始是单元测试,集中对用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。 集成测试把已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。 确认测试则是要检查已实现的软件是否满足了需求规格说明中确定了的各种需求,以及软件配置是否完全正确。 系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份组合在一起进行测试。 4.2.2 编辑联系人功能测试 联系人详细界面中有修改、删除和返回按钮,在选择修改功能后,联系人的所有信息处于可编辑状态,手机号码和固定电话则被EditView设置为只可输入数字,修改完后点击确定按键,触发确定按键点击监听事件,从而对数据库中该联系人信息进行更改,然后自动返回联系人浏览界面。在联系人列表中选择某个联系人点击查看联系人详细信息,联系人手机、办公室电话、家庭电话、职务称等一览无遗,同时在联系人详细信息界面下面会出信功能键,这时的联系人信息是不能操作的,如果想要对联系人进行修改点击修改功能键对联系信息进行修改。测试结果如图5-1编辑联系人界面。 图4-1 编辑联系人界面 4.2.3 查找联系人功能测试 如图6-2查找联系人界面,在联系人列表显示中,输入姓名或者号码对联系人进行查找,程序自动筛选符合条件的联系人,如果没有符合条件的联系人则不显示。 图4-2 查找联系人界面 4.2.4 删除联系人功能测试 如图4-3删除界面在系统测试中对联系人进行删除操作时,可以通过对底部菜单框中删除按键的点击,或者联系人详细信息界面中删除按键点击,出现提示框询问“是否要删除”。 图5-3 删除界面 4.2.4 通讯功能测试 在用户在通讯录选择联系人进入联系人详细信息界面,这时点击menu键打开通信功能框如图4-4,然后选择打电话、发信息还是发邮件的功能通过接口套用识别号码跳转到相应的功能。 图4-4 通信功能框 4.3测试总结 通过对本系统进行的多次的测试,系统正确实现了对联系人增加、删除、查找、修改、备份、显示所有、删除所有、发信息、打电话、发邮件等操作,实现了用户对通讯录的基本要求。在测试过程中对程序细节上出现的漏洞进行修补,系统运行的稳定性基本达到要求,运行结果比较良好。在整个工程的构思方面还存在着不足,这些问题还需要今后逐一解决。与此同时,这个软件还可以进一步扩展,带给用户更好的体验与生活的便捷。 参 考 文 献 [1]靳岩, 姚尚朗. Google Android 开发入门与实战[M]. 北京: 人民邮电出版社, 2009: 1-12 [2]景保玉. 2010中国移动应用开发现状与趋势大调查[M]. 北京: 人民邮电出版社, 2011: 2-19 [3] 谭浩强.Java语言程序设计(第三版)[M].北京:清华大学出版社,2008 [4] 余志龙.Android SDK开发范例大全2[M].北京:人民邮电出版社,2010 [5] 郭宏志.Android应用开发详解[M].北京:电子工业出版社,2010 [6] 李飞.最新实用网络技术教程[M].西安:西安电子科技大学出版社.69~70,124~126 [7] 张利国,龚海平,王植萌.Android移动开发入门与进阶[M].北京:人民邮电出版社,2009 [8] 韩敬海.Android程序设计[M].北京:电子工业出版社,2012 [9] 杨丰胜.Android应用开发解密[M].西安:机械工业出版社,2010.1~63
4.2系统测试结果ID 用例描述 操作步骤 预期结果 实际结果 1 联系人增加功能 1、输入联系人相关信息 能实现联系人增加功能 符合预期 2 联系人删除功能 1、联系人详细信息界面删除 联系人信息成功删除 符合预期 3 联系人查找功能 1、输入要查找联系人的相关信息进行查找 成功查找出符合条件的联系人 符合预期 4 通讯功能 1、联系人详细信息界面点击menu弹出通讯功能界面 成功实现联系人打电话、发信息、发邮件功能 符合预期 5 通讯录底部菜单功能 增加联系人 功能键实现 符合预期
