信息工程学院
课程实训
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
姓 名 管琦
学 号 2013110538
实训名称: 安卓金山手机卫士项目实训
所在班级: 13信管
实训时间: 2014年6月23日-7月1日
实训地点: 13信管班
实验室
17025实验室iso17025实验室认可实验室检查项目微生物实验室标识重点实验室计划
(工B201)
实训教师: 马伟奇
实训企业:北京传智博客教育科技有限公司
实训成绩:
宿州学院信息工程学院实习实训中心制
一、实训基本信息
实训项目名称
安卓金山手机卫士
实 训 环 境
JDK8.0和Eclipse+ADT+SDK的开发环境
二、实训项目简介(包括项目的选
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
依据、功能体系、项目开发的技术与方法等)
1.项目选题依据:
根据学生学习的基本编程思想和所学的数据库知识和基础的JAVA知识进行项目
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
2.功能体系:
(1)对前面知识的综合应用,复习基础一遍。
(2)熟悉代码,找到敲代码的感觉;
(3)每天会有1000-1500行代码量;这几天下来一共就会有1万多行代码量。
(4)大学软件工程的学生毕业要求3-5万行的代码量。10几天完成三分之一、五分之一;
(5)版本控制,每一天的代码用版本控制起来,可以看到每天的代码;
(6)演示程序代码。
(7)演示功能有: 启动页面; 主页;通讯卫士,黑名单的管理,电话拦截、短信拦截的演示;
3.项目开发的技术与方法:
(1) Svn服务器的使用:演示svn安装好的样子;查看提交了哪些文件,修改了哪些代码 ;基于已经存在的RepositoriesX代码仓库,创建代码创库;建立创库RepositoriesX代码仓库,导入代码;----基于已有的创库;基于创库建立新MobileSafe代码工程;----建立一个新的工程;
(2)代码组织结构:按照模块 组织代码的包结构。 业务之间彼此独立;
(3)Splash界面:写界面;动态获取程序的版本名称的方法,运行演示看效果;演示提交代码;
(4)连接服务器获取更新信息:查看当前升级提醒对话框效果图;画升级
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
图;到webservice里去写json文件:update.json;Anddroid工程添加联网权限:android.permission.INTERNET;
在子线程钟请求服务器代码checkVersion();请求网络的代码;参照一个解析流的类StreamTools;解析JSON;用Handler更新信息;创建主页面HomeActivity和布局文件;写延迟2秒进入主页面代码;添加AlphaAnimation动画效果;测试异常况好不好用;提交代码到SVN服务器;
(5)应用程序的签名:显示更新对话框showUpdateDialog();下载功能,用到afinal下载框架:FinalHttp,判断SDcard代码;添加SDcard写权限;安装失败;引入apk签名;签名演示
(6)Splash界面的细节:显示4.0的样式:方式是去掉功能清单里的Activity对应的android:theme;放到application里面;当splash页面弹出升级提示框过滤点击返回
三、项目开发过程(1写明项目开发需要用到的C/C++知识点,并给出相关重要代码,并在代码后做出注释。2 写出在项目开发环境下的开发步骤,尽可能详细。可续页。)
一:搭建android开发平台:
1.下载安装包内容:
(1)下载安装JDK java; (2)下载安装Eclipse;
(3)下载安装 android SDK
2.软件安装内容:
(1)安装JDK; (2)解压安装Eclipse; (3)解压安装android SDK;
(4)配置Eclipse,Android SDK环境; (5)新建android项目;(6)配置运行
二,程序设计内容
1,金山手机卫士欢迎界面并提示升级与否
SplashActivity.java
package com.example.mobilesafe_szxy;
import java.io.File;
import org.json.JSONObject;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.Toast;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
/**
* ============================================================
*
* 版 权 : 黑马程序员教育集团 版权所有 (c) 2015
*
* 作 者 : 管琦
*
* 版 本 : 1.0
*
* 创建日期 : 2015-6-23 下午3:25:15
*
* 描 述 :
*
* 欢迎界面 用来展现产品的Logo; 应用程序初始化的操作; 检查应用程序的版本; 检查当前应用程序是否登录、是否连接网络等; 修订历史 :
*
* ============================================================
**/
/**
* ============================================================
*
* 版 权 : 黑马程序员教育集团 版权所有 (c) 2015
*
* 作 者 : 管琦
*
* 版 本 : 1.0
*
* 创建日期 : 2015-5-25 下午8:16:46
*
* 描 述 :
*
* 欢迎界面 修订历史 :
*
* ============================================================
**/
public class SplashActivity extends Activity {
// 本地的版本号
private int versionCode;
//模拟器的快捷键:
//esc 后退
//home 最小化
//ctrl + F5或者F6
//F2菜单
@Override
protected void onCreate(Bundle savedInstanceState) {
// ctrl + 0;
super.onCreate(savedInstanceState);
initView();
}
/**
* 初始化view
*/
private void initView() {
setContentView(R.layout.activity_splash);
try {
// 获取到包的管理者
PackageManager packageManager = getPackageManager();
// 获取到包的基本信息
PackageInfo packageInfo = packageManager.getPackageInfo(
getPackageName(), 0);
// 获取到本地的版本号
versionCode = packageInfo.versionCode;
checkVersion();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 服务器的URL地址
// :8080/info.json
private String url = ":8080/info.json";
private String desc;
private String downloadurl;
/**
* 检查版本号
*/
private void checkVersion() {
//初始化联网引擎
//参数表示:2秒钟超时时间
HttpUtils httpUtils = new HttpUtils(2000);
// 发送联网请求
// 第一个参数:表示请求的方法 post get
// 第二个参数:表示请求服务器的地址
// 第三个参数:表示服务器成功或者失败的回调
httpUtils.send(HttpMethod.GET, url, new RequestCallBack
() {
@Override
public void onFailure(HttpException arg0, String arg1) {
Toast.makeText(SplashActivity.this, "联网失败", 0).show();
loadMainUI();
}
@Override
public void onSuccess(ResponseInfo arg0) {
System.out.println(arg0.result);
// 联网成功--?{"downloadurl":":8080/mobilesafe.apk","version":2,"desc":"下载安装送大礼包"}
processedData(arg0.result);
}
});
}
/**
* 处理服务器返回的数据
*
* @param result
* json数据
*/
protected void processedData(String result) {
try {
// 初始化json对象
JSONObject obj = new JSONObject(result);
// 获取服务器返回的下载apk的地址
downloadurl = obj.getString("downloadurl");
// 获取服务器返回的版本号
int ser_version = obj.getInt("version");
// 获取到服务器返回过来的描述信息
//ctrl + 1把当前的变量变成成员变量
desc = obj.getString("desc");
System.out.println("----------------------------");
System.out.println("apk地址----" + downloadurl);
System.out.println("ser_version版本号----" + ser_version);
System.out.println("描述信息----" + desc);
// 判断服务器的版本号和本地的版本号是否一致
if (ser_version == versionCode) {
new Thread(){
public void run() {
SystemClock.sleep(2000);
loadMainUI();
};
}.start();
// 版本号一致进入到主界面
} else {
// 展示升级的对话框
showDialog();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 展示对话框
*/
private void showDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 设备标题
builder.setTitle("提示");
//设置基本信息
builder.setMessage(desc);
//导包ctrl + shift + o
//设置取消监听
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
loadMainUI();
}
});
/**
* 第一个参数:文本
* 第二个参数:点击监听
*/
builder.setPositiveButton("升级", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
downLoadApk();
}
});
/**
* 取消进去到主界面
*/
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
loadMainUI();
}
});
// 切记一定要show。
builder.show();
}
/**
* 下载apk
*/
protected void downLoadApk() {
// TODO Auto-generated method stub
System.out.println("下载apk");
HttpUtils httpUtils = new HttpUtils();
//下载
//第一个参数:下载APK地址
//第二个参数:下载到什么地方(放置的位置)
httpUtils.download(downloadurl, "/mnt/sdcard/temp.apk", new RequestCallBack() {
//下载失败
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
Toast.makeText(SplashActivity.this, "下载失败", 0).show();
}
//下载成功
@Override
public void onSuccess(ResponseInfo arg0) {
// 下载成功之后必须安装软件
System.out.println("进入安装界面");
//隐式意图
//安装软件
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/temp.apk")), "application/vnd.android.package-archive");
startActivity(intent);
}
});
}
/**
* 进入到主界面
*/
private void loadMainUI() {
//初始化跳转
//第一个参数:上下文
//第二个参数:想跳到什么地方去
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}
2,金山手机卫士主界面
Activity_main_xml
3,黑名单弹出界面和黑名单管理界面
Activity_black_number.xml
4, 黑名单拦截设置
Activity_black_number_setting.xml
5,添加黑名单号码
dialog_view.xml
6删除黑名单
BlackNumberActivity.java
private void initView() {
// 设置界面
setContentView(R.layout.activity_black_number);
// 找到添加的按钮
Button button_add_black_number = (Button) findViewById(R.id.button_add_black_number);
// 设置点击事件
button_add_black_number.setOnClickListener(this);
// 找到数据列表控件
ListView list_view = (ListView) findViewById(R.id.list_view);
// 初始化数据适配器
adapter = new BlackNumberAdapter();
// 把数据设置到数据列表控件上面
list_view.setAdapter(adapter);
}
private class BlackNumberAdapter extends BaseAdapter {
@Override
public int getCount() {
if (null != mDatas) {
return mDatas.size();
} else {
return 0;
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = View.inflate(BlackNumberActivity.this,
R.layout.item_black_number, null);
// 查询黑名单电话号码控件
TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
// 查询到黑名单拦截模式的控件
TextView tv_mode = (TextView) view.findViewById(R.id.tv_mode);
//找到删除按钮
ImageView iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
//给删除按钮添加点击事件
iv_delete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Toast.makeText(BlackNumberActivity.this, "我被点击了", 0).show();
//首先获取到要删除的电话号码
String number = mDatas.get(position).getNumber();
System.out.println("删除的电话号码是:" + number);
//得到是否删除成功
boolean result = dao.delete(number);
//如果当前的值为真。那么就删除成功
if(result){
Toast.makeText(BlackNumberActivity.this, "删除成功", 0).show();
mDatas.remove(position);
}else{
Toast.makeText(BlackNumberActivity.this, "删除失败", 0).show();
}
//刷新界面
adapter.notifyDataSetChanged();
}
});
7,短信拦截与短信拦截模式
BlackNumberActivity.java
// 给黑名单电话号码设置数据
tv_number.setText(mDatas.get(position).getNumber());
//获取到拦截的模式
String mode = mDatas.get(position).getMode();
/**
* 拦截模式
* 1 全部拦截(电话拦截 + 短信拦截)
* 2 电话拦截
* 3 短信拦截
*/
// 设置拦截模式
if(mode.equals("1")){
//全部拦截
tv_mode.setText("电话+短信拦截");
}else if(mode.equals("2")){
//电话拦截
tv_mode.setText("电话拦截");
}else if(mode.equals("3")){
//短信拦截
tv_mode.setText("短信拦截");
}
return view;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
}
@Override
public void onClick(View v) {
Toast.makeText(this, "弹出对话框", 0).show();
// 初始化对话框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
// 把xml转换成view
View view = View.inflate(BlackNumberActivity.this,
R.layout.dialog_view, null);
//查询到文本输入框
final EditText et_phone = (EditText) view.findViewById(R.id.et_phone);
//查询到OK按钮
Button bt_ok = (Button) view.findViewById(R.id.bt_ok);
//找到取消按钮
Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel);
//找到拦截电话选择框
final CheckBox cb_phone = (CheckBox) view.findViewById(R.id.cb_phone);
//拦截短信
final CheckBox cb_sms = (CheckBox) view.findViewById(R.id.cb_sms);
//给确定设置点击事件
bt_ok.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//et_phone.getText()获取到电话号码
//.toString()转换成字符串
//trim()去掉左右空格
String number = et_phone.getText().toString().trim();
System.out.println("当前用户输入的黑名单电话号码是:-------"+ number);
//判断当前用户输入的电话号码是否为null
if(TextUtils.isEmpty(number)){
Toast.makeText(BlackNumberActivity.this, "请输入电话号码", 0).show();
return ;
}
String mode = "0";
/**
* 拦截模式
* 1 全部拦截(电话拦截 + 短信拦截)
* 2 电话拦截
* 3 短信拦截
*/
//判断当前电话的拦截模式是否被勾选
//判断当前短信的拦截模式是否被勾选
if(cb_phone.isChecked() && cb_sms.isChecked()){
//全部拦截
mode = "1";
}else if(cb_phone.isChecked()){
//电话拦截
mode = "2";
}else if(cb_sms.isChecked()){
//短信拦截
mode= "3";
}else{
Toast.makeText(BlackNumberActivity.this, "请输入拦截模式", 0).show();
return ;
}
//说明用户已经输入了黑名单电话号码和拦截模式
BlackNumber blackNumber = new BlackNumber();
blackNumber.setMode(mode);
blackNumber.setNumber(number);
//把黑名单电话号码和拦截模式添加到数据库
//返回一个添加是否成功的结果
boolean result = dao.add(number, mode);
//判断是否添加成功
if(result){
Toast.makeText(BlackNumberActivity.this, "添加成功", 0).show();
//把黑名单的对象添加到黑名单集合里面去
mDatas.add(blackNumber);
}else{
Toast.makeText(BlackNumberActivity.this, "添加失败", 0).show();
}
//刷新界面
adapter.notifyDataSetChanged();
dialog.dismiss();
}
});
//给取消设置点击事件
bt_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 让对话框消失
dialog.dismiss();
}
});
// 把view设置成对话框的界面
builder.setView(view);
// 展示对话框
dialog = builder.show();
}
}
四、项目运行与测试(注:粘贴系统运行的几个关键截图,并加以文字说明测试的步骤及对应的运行状态。可续页。)
(1)设置环境变量
(2)虚拟机开始界面 (3)虚拟机内部应用及部件
(4)欢迎界面与下载安装大礼包对话框
(5)主界面
(6)黑名单管理界面
(7)黑名单拦截设置
(8)添加黑名单
(9)删除黑名单
(10)短信拦截
信息工程学院课程实训小结
学 号
2013110538
姓 名
管琦
班 级
13信管
实
训
主
要
内
容
及
个
人
感
受
实训的主要内容:通过编写Java源文件.,并使用javac指令编译源文件javac 和使用java指令进行执行程序,主要是设置登录保存账号,学会利用数据库保存数据并通过查询数据库列表展示,对列表中的内容进行刷新和对数据库数据进行删除等操作;利用JAVA的基础知识,进行安卓配置环境,掌握各种UI控件使用,以及布局配置,利用xml文件书写,在数据库中进行插入删除等的操作,最后在ListView中列表展示,在一种安卓特有的数据存储(sharePreference)中,进行界面跳转链接等功能;
个人感受:实训通过上机训练,发现自己的实践能力的不足,了解平时只注重理论,忽视了实践,将理论和实践并没有很好地结合起来,没有有效的做到理论与实践相结合。做实验的时候必须理解这个实验的原理才能够发现其中的错误,学会自己思考分析问题,解决问题。但有时候也需要同学和老师的帮助,也许老师和同学的一句话就能够是自己豁然开朗,就会进行修改程序,最后试验能够做成功也会有一种成就感。在这次实训中明白了团队精神的重要性,小组组长必须做好协调工作,协调组员关系,给组员分配适合他们的任务。成员尽力完成属于自己的任务,同时加强协作,做到组长和组员相互合作,相互配合,以达到团队最优化。通过遇到的问题发现了自己的不足,坚持着积极寻求解决方法,重新认真细心规划设计好所需要的类,弄清楚各个类的作用,在进行编程。明白了做任何事,都需认真细心,注意好每一步骤。更明确了学习方向。加深对课堂讲授内容的理解,熟悉程序开发环境、学习计算机系统的操作方法,学习上机调试程序。
在短暂的实训过程中,我深深的感觉到自己所学的知识的肤浅和在实践运用中知识的匮乏,刚开始的一段时间里,对一些工作无从下手,茫然不知所措实习实训是每个大学生必须拥有的一段经历,它让我在实践中掌握知识,让我学到了很多课堂上根本就学不到的知识,也开阔了视野,增长了见识,为我以后进一步走向社会打下坚实的基础。在以后的工作上我会有争取更大的进步。相信今后无论什么时候回想起这段经历,都会觉得是快乐的,而且永远铭记于心。再次感谢老师严谨求实的精神观念,实事求是的治学态度和负责人得态度,深深地感染了我,不仅仅使我开拓了视野,拓宽了思路,增长了知识,而且为我们以后的工作和学习打下了坚固的基础,也增长了我对计算机的兴趣。