Android结课报告.docx
《Android结课报告.docx》由会员分享,可在线阅读,更多相关《Android结课报告.docx(16页珍藏版)》请在冰豆网上搜索。
Android结课报告
智能移动平台开发
结
课
报
告
学院软件学院
年级2014级
班级3班
学号**********
姓名牛菲菲
2016年06月23日
一、基础实验部分
(一)实验内容
在实验指导书的指导下完成安卓手机端天气应用的开发。
主要实验的内容有环境搭建、界面设计、页面跳转、访问网络、service使用、BaseAdapter的使用、以及数据库的使用。
通过这几方面完成安卓手机端的天气应用的设计开发并熟悉安卓开发UI设计、页面跳转、连接网络以及数据库等。
(二)步骤及实验结果
2.1主要实验阶段和步骤
2.1.1环境搭建
安装JDK,配置环境;安装AndroidStudio。
然后新建空白项目,点击运行按钮,根据指示下载安卓虚拟机,最后运行成功后会显示HelloWorld。
环境搭建完毕。
2.1.2UI设计
根据实验指导书设计三个页面的界面。
activity_main.xml表示的是主页面,嵌套结构一定要分清楚。
activity_city_layout.xml、activity_search_layout.xml分别是另外两个页面。
同时也需要设置颜色以及字符。
2.1.3Intent和Activity使用
使用Intent以及onCreate()实现页面的跳转,在跳转的同时还可以传送数据。
2.1.4网络访问
通过连接网络获取XX天气API然后将数据输出到页面上。
同时也利用完成城市搜索功能。
通过修改AndroidManifest.xml的权限设置访问网络,同时记得修改MainActivity.java文件。
2.1.5Service的使用
使用Service实现隔一段时间更新天气情况。
新建服务RefreshService.java,然后在AndroidManifest.xml中注册服务。
定义广播接收器,注册该接收器,并且开启服务,在Activity结束时结束服务,并注销接受者
2.1.6BaseAdapter的使用
修改界面二,使用BaseAdapter,使得listview的每一项左边是文字,右边是复选框;使得删除按钮会根据复选框被选情况而改变可用状态。
新建activity_city_listview_item.xml,在CityActivity.java中新建内部类MyAdater,继承自BaseAdapter。
2.1.7数据库的使用
建立数据库,存储用户收藏的城市;实现显示城市、添加城市和删除城市。
新建DBHelper.java,继承SQLiteOpenHelper,然后下一步实现增删查的操作。
2.2实验结果
实验为经过半学期的课程,在实验课以及课下完成。
如图
(1)为实验完成的最终结果,右上角为button。
点击button可以进行城市管理,点击添加按钮,可以进行城市的添加。
如图
(2)所示为添加郑州。
图
(1)图
(2)
添加如图(3)所示城市,选择安阳后返回主页面,可以看到城市天气预报为安阳天气,如图(4)所示
图(3)图(4)
将除了郑州外的城市选中,然后点击
删除按钮,可以看到城市一栏仅剩郑
州,返回首页,城市变为郑州,如图
(5)所示。
(三)遇到的问题及其解决方法
3.1本次实验过程中刚开始由于没有理解层次关系,所以在粘贴复制代码的时候顺序粘贴,导致程序运行失败。
后来经过多次的重复实验才改正过来。
3.2由于实验指导书中search拼写错误,所以在粘贴复制后一直发生错误,经过详细的检查才发现是拼写错误
3.3在粘贴复制后由于复制内容过多导致一些额外的内容出现,而且字体很小,难以辨别,从而导致程序运行出错。
经过多次的检查才解决问题。
3.4由于虚拟机中没有中文输入法,导致联网后不能进行城市的查询,通过数据线将程序装到手机上后才可以查询
二、结课实践部分
(一)主要内容
在结课实践部分,开发一个旅行日记。
人们在旅行中往往会产生一些感悟,随手记下来。
旅行日记允许人们在旅途中随时记录自己的所见所感所想,在编辑文字的同时,用户也可以上传照片,如果不想码字,也可以使用语音输入,用语音记录旅途。
但是由于时间和能力原因,目前还有部分功能尚未实现。
目前主要实现以下功能:
1、注册:
通过注册获得自己的用户名和密码。
(注册的密码仍然为显式,尚未修改成功)
2、登陆:
输入正确的账户信息即可登录成功。
3、新建日记:
点击菜单的创建日记可实现写日记功能并对内容进行保存。
4、查看日记:
点击菜单的查看日记显示日记列表,并显示日记最后一次修改时间。
同时可选中日记,对日记进行修改或删除操作。
5、删除日记:
对日记列表中的日记进行删除操作。
6、语音记录日记:
点击按钮可以进行语音的录制。
目前只实现页面,录制完成的语音还不能保存、播放。
(二)步骤
操作步骤(预期操作步骤、实际操作步骤)
下面将要通过代码和注释进行讲解:
1.注册:
我们通过注册功能可以实现对于用户的账号和密码的存储与读取。
对于没有注册过的新用户,我们会将其信息存入数据库,对与已经注册过的老用户,我们会有已经注册过的提示。
主要用到SharedPreferences类,对此类设置一个实例mShared,进而编辑注册页面,通过findViewById函数获取布局文件中的控件的id,具体代码如下:
setContentView(R.layout.register);
ButtonregistButton=(Button)findViewById(R.id.register);
ButtonredeleteButton=(Button)findViewById(R.id.registerdelete);
finalEditTexteditRegistername=(EditText)findViewById(R.id.registeretUid);
finalEditTexteditRegisterpassword=(EditText)findViewById(R.id.registeretPwd);
下一步是设置点击注册按钮时候的应答,基本思路是,为注册按钮创建一个监听,然后当点击按钮是会触发这个监听,进而把用户输入的信息和mshared中的信息进行对比,当mshared中不存在,对mShared函数进行编辑,否则,则提醒用户已经注册过。
不存在的情况:
Editoreditor=mShared.edit();//为编辑代码
将用户输入的信息通过putString函数储存到mShared里的相应关键字中,应当注意put完毕后,必需要commit()否则无法保存:
mit();后面的ShowDialog函数,实现当注册成功过后产生一个builder来提示并确认。
在注册中我们还加入清除所有账户的功能,即把实例mShared中的所有信息都清空,用remove()函数。
下面是触发注册按钮的实现代码:
registButton.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewarg0){
mShared=getSharedPreferences(SHARED_MAIN,Context.MODE_PRIVATE);
Stringregistername=mShared.getString(KEY_REGISTERNAME,"");
Stringregisterpassword=mShared.getString(KEY_REGISTERPASSWORD,"");
//TODOAuto-generatedmethodstub
if(!
("".equals(registername)||"".equals(registerpassword))){
Toast.makeText(Register.this,
"^_^你已经创建密码请查看系统帮助^_^",5).show();
}else{
/**拿到用户输入的信息**/
Stringregistename=editRegistername.getText().toString();
Stringregistepassword=editRegisterpassword.getText().toString();
/**开始保存入SharedPreferences**/
Editoreditor=mShared.edit();
editor.putString(KEY_REGISTERNAME,registename);
editor.putString(KEY_REGISTERPASSWORD,registepassword);
/**put完毕必需要commit()否则无法保存**/
mit();
ShowDialog("您的密码和账户已经保存成功!
");
}
}
});
2.登录
在登陆中同样用到了SharedPreferences类以及确认mShared中的数据确认工作。
首先还是用findViewById函数获取布局文件中的控件的id
field_name=(EditText)findViewById(R.id.etUid);
filed_pass=(EditText)findViewById(R.id.etPwd);
Buttonbutton1;
Buttonbutton2;
button1=(Button)findViewById(R.id.denglu);
button2=(Button)findViewById(R.id.zhuce);
与注册类似,下面通过设置对于登录按钮的监听实现触发后的其他操作,首先通过getSharedPreferences函数获取当前的数据库(姑且这样叫)中用户的账号和密码,MODE_PRIVATE是该函数的默认操作模式,实现了程序的安全性,表示该文件是私有数据,只能被应用本身访问。
代码如下:
mShared=getSharedPreferences(SHARED_MAIN,Context.MODE_PRIVATE);
Stringregistername1=mShared.getString(KEY_REGISTERNAME,"");
Stringregisterpassword1=mShared.getString(KEY_REGISTERPASSWORD,"");
访问后与用户的输入进行比较。
若用户输入信息为空时,提示错误;若输部分有误的时候,用一个toast提示错误;当发现用户输入的账户名和密码与数据库的数据中一致时,进行跳转(用到一个Thread()函数,控制线程等待三秒再进入主窗口),运用intent函数,从当前activity转到后面的menu界面newMenu.class。
跳转,具体实现代码为:
newThread()
{publicvoidrun()
{try{sleep(2000);//等待三秒,自动进入软件主窗口
Intentintent=newIntent();
intent.setClass(SystemDairyActivity.this,newMenu.class);
startActivity(intent);}
catch(Exceptione){
e.printStackTrace();
}
}
}.start();
这里注册部分只需要实现到注册界面的跳转即可,此时只需要用intent函数实现从当前activity跳转到register.class即可。
后面的onKeyDown函数是当用户按返回按钮的时候能够询问用户时候要退出登录。
3.menu界面介绍:
这个界面的主要共能就是与其他功能界面相连接。
用一个switch-case语句,当点击menu的四个不同块儿时跳转到四个不同的界面。
(删除功能并入了查看界面)
4.创建日记:
重点函数就是onCreate函数。
此函数要实现的功能是可创建编写日记,并实现保存返回等操作。
先通过findViewById函数获取布局文件中的控件的id(两个editText和三个button)。
用getExtras()函数,即获取在lookDiary.java中putExtras()的内容。
在lookDiary.java中有一个修改按钮,当点击时就会跳转到这里来实现修改,并重新保存。
Bundleextras=getIntent().getExtras()
获取put的内容并改名为extras。
如果extras不为空的话,则说明此时为点击修改按钮跳转过来的界面,,则获取内容并让他们显示在可编辑的editText里。
具体实现为:
Bundleextras=getIntent().getExtras();
if(extras!
=null){
Stringtitle=extras.getString(DiaryDbHelper.KEY_TITLE);//如果有putextras,则从那里得到
Stringbody=extras.getString(DiaryDbHelper.KEY_BODY);//初始的title和body值,如果没有则跳过
mRowId=extras.getLong(DiaryDbHelper.KEY_ROWID);//记录在数据库表中的位置
if(title!
=null){
mTitleText.setText(title);
}
if(body!
=null){
mBodyText.setText(body);
}
}
然后当题目或者主体为空时进行提示,用mRowld的值进行判断,0代表数据库中没有这个数,1代表有。
若是修改过的内容时,调用数据库类里的updateDiary()函数;若是第一次创建编写时调用createDiary()函数。
createDiary()和updateDiary()函数都位于DiaryDbHelper.java中,这个类里边写了创建和调用数据库的一些方法。
CreateDiary()函数把title和body值放入数据库的一条记录中,并加入了当前设备中的日期,(当时因为时间与电脑的时间不对还很诧异)。
最后用insert()函数将所有数据添加到数据库中。
UpdateDiary()于此类似,但最后用了一个update()函数,并将ROW_ID赋予新值。
然后使用intent函数设置返回按钮和查看按钮。
最后设置保存按钮,为它建立一个监听事件,当点击触发事件时,先获取最终写在editText中的内容,
5.查看日记:
这部分包含menu的设计,后面是一系列的list,最后是点击list中每一个内容时进行操作。
(1)菜单设计
privatestaticfinalintINSERT_ID=Menu.FIRST;
privatestaticfinalintDELETE_ID=Menu.FIRST+1;
这两句话将menu的第一个位置给新建日记,第二个位置给返回按钮。
然后重载一下onMenuItemSelected()函数,选择INSERT_ID时调用createDiary()函数,选择DELETE_ID跳转到newMenu.class。
(2)每条日记格式的设计
将数据库中的对应信息通过SimpleCursorAdapter()函数放到布局的相应位置。
首先mDiaryCursor=mDbHelper.getAllNotes(),中的getAllNotes函数获取数据库的所有记录信息,然后获取数据库中对应的关键字title标题和created时间的String型字符串数组,并放到对应布局文件的相应位置,使列表中显示每个日记的标题和最后一次修改时间。
SimpleCursorAdapter构造函数的后两个参数from和to,一个包含数据库的列的String型数组,一个包含布局文件中对应组件id的int型数组,其作用是自动的将String型数组所表示的每一列数据映射到布局文件对应id的组件上。
(3)点击listView中每个item时的操作
在onclick函数中首先创建一个builder,当点击修改时,首先在数据库里建一个指针,指向当前我点击的那个item,即用position指当前位置,然后将当前item里的ROW_ID、KEY_TITLE、KEY_BODY,通过putExtra()函数put出去,并同时实现跳转。
getColumnIndexOrThrow(DiaryDbHelper.KEY_TITLE)是得到数据库当前指针指向的item所对应的KEY_TITLE列的索引,并且有异常时抛出的意思,具体实现为:
Cursorc=mDiaryCursor;//指针
c.moveToPosition(position);
Intenti=newIntent();
i.setClass(lookDairy.this,createDairy.class);
i.putExtra(DiaryDbHelper.KEY_ROWID,id);
i.putExtra(DiaryDbHelper.KEY_TITLE,c.getString(c
.getColumnIndexOrThrow(DiaryDbHelper.KEY_TITLE)));
i.putExtra(DiaryDbHelper.KEY_BODY,c.getString(c
.getColumnIndexOrThrow(DiaryDbHelper.KEY_BODY)));
startActivityForResult(i,ACTIVITY_EDIT);
dialog.dismiss();
position指的是点击的这个Viewitem在当前ListView中的位置。
当点击删除时,调用数据库中的deleteDiary()函数,rowid所在的那一列。
数据库中的DeleteDiary()函数调用了delete()函数,把对应的rowid行进行了删除。
6.语音
里面有一个onclick函数switch-case用来实现判断保存,播放跟返回,用intent实现页面的相互跳转。
(三)实验结果
1.启动界面
2.注册
用户输入用户名以及密码可以进行注册(由于函数有问题,不能将密码变成隐式)
3、登录
用户输入用户名以及密码就可以登录查看个人的日记
4、添加日记
5、日记列表
6、删除后
7、语音日记
用户可以直接输入语音记录旅行,但是目前还没有完全实现语音功能
花费时间:
1周
(四)遇到的问题及其解决方法
在本次实验中,登陆注册过程中信息的保存方面以及分享界面的一些内容都是没有学过的比较困难的问题。
连接数据库的部分刚开始不是特别明白,而且一直报错,通过反复琢磨实验指导书以及上网查找示例,询问同学才最终解决。
语音实现的功能是通过查找网络示例学的,但是由于网上是连续的教程,所以有许多是需要修改的地方,比如button的传值,语音信息的记录,导致目前还没有解决完。
经过我和同伴的共同努力,通过上网查相似代码、看书和请教别人,最终解决了问题,同时也学到了很多Android编程开发的知识。
(五)分工说明
牛菲菲:
创建删除修改查看
吴馨怡:
登录注册菜单UI
一起做了语音部分
二、结论与讨论
在之前实验的基础上更加深入的理解了安卓开发的流程,在实验过程中,由最初的一片空白逐渐到后来逐渐清晰,了解了大致的知识内容。
但是,深刻的体会到,安卓开发非常有趣,可以实现许多非常有趣的更能,但是也并不是那么的容易,还有还多的内容需要学习。
通过安卓开发课程,将我领入安卓的世界,让我看到这个世界是如此的美妙,实验过程中看到了同组同学的UI设计是非常好的,安卓有好多知识要掌握。
此次实验,旅行日记的想法自认为是不错的,但是由于时间和能力有限,并没有完全实现最初的想法,希望以后有机会可以实现这个有趣的应用。