2023年7月26日发(作者:)
智能终端软件开发自主学习报告-(3) 目 录
1 引言 ......................................................................................................................... 1
2 安卓的概述 ............................................................................................................. 2
2.1 Android简介 .......................................................................................... 2
2.2 Android平台特性 .................................................................................. 2
2.3 Android用户界面构建 .......................................................................... 3
2.4 资源的获取和使用 ................................................................................. 4
3 功能设计概述与需求分析 ..................................................................................... 5
3.1 软件功能设计 ......................................................................................... 5
3.2 数据库设计 ............................................................................................. 5
3.3 需求分析 ................................................................................................. 5
3.4 用户分析 ................................................................................................ 6
3.3.1用户要求具备基本功能 ............................................................ 6
3.3.2除基本功能外,可另曾特色功能............................................ 6
3.5 系统体系结构 ......................................................................................... 7
4 功能模块介绍 ......................................................................................................... 7
4.3 添加日记模块 ....................................................................................... 10
4.4 编辑日志 ............................................................................................... 11
4.5 添加设置闹钟 ....................................................................................... 13
自学心得 ..................................................................................................................... 16
参考文献 ..................................................................................................................... 17
1 1 引言
随着Android的崛起,智能手机的操作系统绝大数都是Android系统。Android的成功,并不是什么巧合,Android所获得的成就,有2个重要方面:d是一款开放源码的操作系统;因此,人人都有可能成为Android的开发人员,这样使得Android的应用丰富多彩。d注重用户体验;用户体验的提高,使得操作变得更加的简单方便。
手机给我们带来了便利,我们随身带着的手机可以集成许多的功能,其中就能够有日志的功能,因为方便携带所以我们不需要带上那保密性差,有容易遗失的日记本了,我们现在只需要用手机,就能够随时随地的记录下我们容易遗忘的事情,因此,我们设计了这么一款手机日志程序。
本论文所设计与开发出的这款基于Android手机的日志,分析了Android系统的技术原理和实现策略,以更加合理和有效的方式实现了各个功能模块,最后将其有机结合在一起,成为一款实用的日志软件。本系统包括日志的添加,修改,删除等操作,为了让其更加实用,1 我们还搭配了闹钟的功能,使得界面简洁清晰,使用方便且人性化。
2 安卓的概述
2.1 Android简介
Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2011年11月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为58%。
Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。目前尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他领域上。Android的主要竞争对手是苹果公司的iOS以及RIM的Blackberry
OS。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。
2.2 Android平台特性
1、应用程序框架 支持组件的重用与替换。
2、Dalvik 虚拟机 专为移动设备优化。 3、集成的浏览器 基于开源的 2 WebKit 引擎。
4、优化的图形库 包括定制的2D图形库,3D图形库基于OpenGL ES 1.0 (硬件加速可选)。
5、SQLite 用作结构化的数据存储。
6、多媒体支持 包括常见的格式
(如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)。
7、GSM 电话技术 (依赖于硬件)。
8、蓝牙Bluetooth, EDGE, 3G, 和 WiFi (依赖于硬件)。
9、照相机,GPS,指南针,和加速度计(accelerometer) (依赖于硬件)。 10、丰富的开发环境 包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件。
2.3 Android用户界面构建
在Android平台下开发应用软件,最重要的是布局问题。一个好看而又简洁的界面,是相当重要的,既能提高使用者的体验,又保证应用的高效执行。Android生成用户界面有三种方式:xml配置生成、通过用户自己的界面接口生成和直接用代码生成。对于一个Activity应用来说,ty类是一个最基本的功能单元。一个Activity实例可以做很多的事情,但是它本身无法显示在屏幕上,而是借助于View group和View,这两个是Android平台上最基本的两个用户界面表达单元。下面介绍下主要的布局对象: 线性布局(Linear Layout):以单一方向对其中的显示对象进行排列显示。 如以垂直排列显示,则布局管理器中将只有一列;如以水平排列显示,则布局管理器中将只有一行。同时,还可以对个别的显示对象设置显示比例[2]。 表格布局(Table Layout):以拥有任意行列的表格 3 对显示对象进行布局,每个显示对象被分配到各自的单元格之中,但单元格的边框线不可见。 绝对布局(Absolute Layout):允许以坐标的方式,指定显示对象的具体位置,左上角的坐标为(0,0),向下及向右,坐标值变大。这种布局管理器由于对象的位置固定了,所以在不同的设备上,有可能会出现不一样的显示效果。 相对布局(Relative Layout):允许通过指定显示对象相对于其它显示对象或父级对象的相对位置来布局。一个按钮可以放于另一个按钮的右边,或者可以放在布局管理器的中央。 对于Android应用中的一个屏幕,它的屏幕元素是按层次结构来描述的。要将一个屏幕元素层次树绑定在一个屏幕上显示,Activity会调用它的setContentView()方法并且传入这个层次树的根节点引用
2.4 资源的获取和使用
资源是外部文件(不含代码的文件),它被代码使用并在编译时编入应用程序。 Android支持不同类型的资源文件,包括XML、PNG以及JPEG文件。它们在运行的时候被解析,XML文件根据描述不同有不同的格式。源代码以及XML文件将资源打包并编译进二进制文件,这种模式能使得资源更快的被加载。字符串也同样被压缩成更高效的模式。 由于这些原因,Android平台上可以有不同的资源类型。Android资源系统能跟踪所有非代码相关的应用程序。程序开发者可以使用资源类来访问应用程序的资源,资源的实例通常和应用程序联系在一起,可以通过ources来访问。应用程序的资源在编译时就被编译到应用程序二进制代码里为了使用某个资源,程序开发者需要将它放在对应的代码目录结构里,然后编译。作为编译过程的一部分,产生的资源代号可以在源代码里使用,这就可以用编译器来验证程序代码和定义的资源是否相符。
Android的闹钟系统提供了警报和时间设置方面支持,其实现的硬件基础通 常是实时时钟设备。在Linux内核代码中,需要有实时时钟设备驱动程序和Android的Alarm驱动程序。警报器-实时时钟系统包含了JNI和JAVA层的接口,在JAVA应用程序层可以通过接口控制警报器方面的功能。
4
3 功能设计概述与需求分析
3.1 软件功能设计
该系统的设计与实现主要包括以下几个方面的工作:
1.搭建基于Android系统平台的多功能日记本构架,设计包含了写日志,我的日记本,闹钟和闹钟情景模式,四个功能模块的日记本系统体系。
2.对日记本系统四个功能模块逐一论述需求分析,构建每一模块的基本功能和预期产生的效果。
3.采用面向对象的程序设计方法分别实现写日记、查看和修改日志、设定闹钟和修改闹钟选项四个功能模块。
4.分别对四个功能模块进行软硬件测试,在每一模块测试成功的基础上,完善整个日记本系统功能连调。 基于Android系统手机开发的日记本软件界面友好,操作便捷,具有良好的扩展性和可维护性。经过系统测试,该软件工作安全可靠,可以稳定运行。
3.2 数据库设计
该程序数据库是在Android平台上执行Java代码,通过DVM编译来建立的,由于整个SQLite数据库是非可视化操作,因此所有对数据库的操作都是通过执行Java代码实现。且表的设计也尽量优化,没有错综复杂的关系,每张表都是独立的,不存在任何约束,因此数据库也是独立数据库。
3.3 需求分析
5 日记本是很平常的东西,很多人都有记日记的习惯,有人记账,有人记事、有人记下心情。随着计算机技术的发展,很多家庭都买了手机,开始上网,开始使用电脑和手机来办公、打字等。所写现在也有很多的人在使用电脑说说,写博客,发帖子等等,受此启发我就萌生了编写一个日记本,用手机来写日记的想法。
很多事我们不想忘记,于是写进日记本里,多年后翻出来再看看,很是惬意。大多数人都使用的是纸质的日记本,这中日记很难保存,容易丢失,也容易遭到水浸等物理破坏,这样我们的日记就丢了。同纸质的日记本相比较,用软件日记本不仅环保,而且安全方便,不怕被别人偷看。软件日记本可以很方便的携带只要存在手机里面就可以了。
3.4 用户分析
这个软件面向的用户是拥有手机的大众,而其具有写日记的习惯的人。用户使用的软件必须简单容易使用,界面得体,在此基础上尽可能多的提供人性化功能,丰富软件的内涵。同时软件必须尽量保证不会因用户的不当操作而使用户受到严重的经济、财产、精神损失。软件必须具有很强的可靠性,不会无故终止运行、死机、退出等。
3.3.1用户要求具备基本功能
a 编写日记:包括添加日记和取消。
b 管理日记:包括保存及删除日记、按日期分组日记。
c编辑闹钟:包括设定闹钟,和删除闹钟
d设置魔石:包括设定闹钟的提醒方式和删除方式
3.3.2除基本功能外,可另曾特色功能
a 闹钟音乐播放。
b 编辑闹钟提醒方式。
6 3.5 系统体系结构
系统主旨在建立系统的闹钟,日志等,主要有如下几个核心功能模块
欢迎主界写日
查看闹钟界面4 功能模块介绍
4.1 欢迎界面
添加联系人整个布局的主体采用默认的LinearLayout来呈现,采用TableRow的好处是对齐很方便,为了整体的美观,大多数情况都是用的Imageview和Imagebutton控件显示,如下图的代码和图4-1所示。
android:layout_marginTop="50dp" android:layout_marginLeft="19dp" android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/title" android:contentDescription="@string/hello_world" 7 /> android:id="@+id/picmak" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="130dp" android:layout_marginLeft="150dp" android:src="@drawable/p6" android:background="#00000000" android:contentDescription="@string/hello_world" 图4-1 8 4.2 主界面 主界面里面就是通向其他界面的四个按钮,因为总体界面不是很大,所以我尝试使用了HorizontalScrollView控件,多数的代码都是由系统自动生成,我的工作就是给四个控件添加监听事件,如图4-2-1,4-2-2所示。 图4-2-1 9 图4-2-2 4.3 添加日记模块 点开写日记,即可添加日记,因为日记需要保存信息,所以需要吧信息都保存在数据库中,我们首先要创建一个数据库,新建,然后创建一个数据库,数据库文件名称为my_,因为Android的数据库是不是可视的,所以尽可能的把数据库能够书写的简单一点,部分代码如下。效果图如图4-3 private SQLiteDatabase db; protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_write); imgbut1=(ImageButton) findViewById(1); imgbut2=(ImageButton) findViewById(2); houtui=(ImageButton) findViewById(); w_tit=(EditText) findViewById(.w_tit); w_cont=(EditText) findViewById(.w_cont); db=new MyLiteHelper(this).getWritableDatabase(); 10 图4-3 4.4 编辑日志 日志添加过后肯定需要有所改动,所以需要有添加、删除、修改的选项,而日志内容就需要接收之前存储的数据库。读取接收的部分代码如下。效果图如图4-4 接收日志 Intent intent=getIntent(); id=Extra("", 1); String tit=ingExtra(""); String cont=ingExtra(""); String datetime=ingExtra("me"); 修改或者删除日志 switch(()){ case 1_1:{ String tit=edt_t().toString().trim(); String cont=edt_t().toString().trim(); String sql="update my_note set title='"+tit+"',content='"+cont+"' 11 where id='"+id+"'"; } } case 2_1:{ } case 3_1:{ } case _1:{ finish(); break; ativeButton("否", null); ().show(); break; r builder=new Builder(); le("删除"); n(le.t_sc); sage("是否删除"); itiveButton("ok", new @Override public void onClick(DialogInterface dialog, int which) { } // TODO Auto-generated method stub String sql1="delete from my_note where id="+id; L(sql1); xt(, "删除成功", finish(); edt_t(""); edt_t(""); break; L(sql); xt(, "保存成功..", finish(); break; _LONG).show(); kListener() { _LONG).show(); }); 12 图4-4 4.5 添加设置闹钟 闹钟与闹钟的情景模式是相互关联的,添加闹钟后可以再情景模式当中或者是闹钟设置当中选择提醒的方式,部分情景模式设置的代码如下,效果图如图4-5-1和4-5-2所示。 hours = 0; minutes = 0; c = tance(); intent = getIntent(); isnew = Extra("MY_ALARM_TYPE", 2); // 2表示新的,1 表示type="常规模式"; if (isnew == 1) { hours = Extra("hours", 0); minutes = Extra("minute", 0); (_OF_DAY, hours); (, minutes); num = Extra("num", 0); type = ingExtra("type"); 13 旧的 id = Extra("id", 0); t("你选定的时间是" + hours + "时" + minutes + "分" + id); } if (("常规模式")) { cked(true); my_check = 1; } else if (("震动模式")) { cked(true); my_check = 2; } else if (("静音模式")) { cked(true); my_check = 3; } 14 图4-5-1 15 4-5-2 图 自学心得 安卓应用程序设计中,我遇到了很多的问题,但同时我也收获很多,设计开发过程初期,我一直都不清楚我要做一个什么样子的程序,所以一开始都是漫无目的的去做着登录界面,最近的几周都有考试,设计不是没有进展,只是比较缓慢,后来我发现我总是莫名的忘记一些事情,真巧最近有安卓程序设计,想着想着我就开始着手制作起日志和闹钟的程序了。但是,刚开始并不能预测难度,跟着书本我学习了许多控件的用法,先实现基本的逻辑框架,和界面框架,然后在此基础上进一步完善丰富,设计制作的过程中很多的函数、属性、成员名都是英文的,甚至连应用软件Eclipse也只有英文版的,大感头疼的我只能自己去翻英汉字典,或者网上查找。首先遇到的问题便是事件监听,我之前虽然做过类似的JAVA课程设计,但我并没有好好的掌握,自己的程序完成后产生大量的错误,最后还是迫不得已去使用网上已有的源代码和脚本,经过几番的调试,我终于算是完成第一个界面。一开始我用button做的界面,因为方便使用,很好的布局,但是每当扩充一种功能时,为了使界面整体美观,我换成了imagebutton,界面变得简单,使用方便。 这次的自主学习中我学会了设置安装环境,也基本掌握了安卓的开发方法及基本流程。在本次开发过程中,安卓的设计中还需要用到的XML和SQL的语言,主要用到的知识有Activity的使用,在程序中用到了多个窗口,因而需创建多个Activity。主要是用于多个Activity之间的跳转。在开发期间,我学会了有目的的去学习一些将要用到的东西,仔细地考虑工作流程的规律和步骤,充分利用手中的开发工具,利用其所具备的功能,尽量使自己的开发在代码上实现少而精确、让用户能够尽量简单地进行操作。但是在检测过程中,还是出现了很多的不足之处,这些都是要在今后的工作中需要努力改进和完善的。 在这次程序开发设计中,我也难免会遇到不少困难,这主要是由于我对所用的开发环境并不是很熟悉,开发软件的经验不足。安卓开发用的语言是java,这次开发对我来说可以算是一次锻炼,整个开发过程并虽然不是很顺利,却使我从中充分体会到学习的快乐,开发的程序也在一步步得到完善。 虽然我只能完成一些基本的功能,好多设想都未实现,但是当我第一次在我的手机上用到了我自己开发的程序,我的顿时信心大增,整个学习的过程变得让人满足和愉 16 悦。 17 参考文献 [1].王保罗.Java面向对象程序设计[M]. 北京:清华大学出版社,2003年 [2] 杜波依斯. MySQL技术内幕[M]. 第4版. 人民邮电出版社 , 2011年 [3] 熊刚.基于.Android的智能手机的设计与实现[D].武汉理工大学,2010 [4] 靳岩,姚尚朗.Android 发入门与实践[D].人民邮电出版补, 2009 18 附录:程序 package r; import ; import m; import .R; import t; import Inflater; import ; import oup; import apter; import ew; public class MyAlarmAdapter extends BaseAdapter { data) { @Override public long getItemId(int arg0) { // TODO Auto-generated method stub @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return (arg0); } @Override public int getCount() { // TODO Auto-generated method stub return (); } t = context; = data; } public MyAlarmAdapter(Context context, List private Context context; private List 19 arg2) { "+ute()+"分"); package ; public class MyAlarm { int minute) { = id; = type; = num; = hours; = minute; } public MyAlarm(int id, String type, int num, int hours, private int id; private String type; private int num; private int hours; private int minute; return view; } // TODO Auto-generated method stub View view; if(arg1!=null){ view=(context).inflate( } TextView type=(TextView) TextView time=(TextView) MyAlarm ma=(arg0); t("模式:"+e()); t("所设置的时间:"+rs()+"时view=arg1; }else{ @Override public View getView(int arg0, View arg1, ViewGroup return arg0; } ty_alarm_list_item,null); ewById(_type); ewById(_time); 20 public String getType() { public void setId(int id) { = id; } public int getId() { return id; } return type; } public void setType(String type) { = type; } public int getNum() { return num; } public void setNum(int num) { = num; } public int getHours() { return hours; } public void setHours(int hours) { = hours; } public int getMinute() { return minute; } public void setMinute(int minute) { = minute; } package ; public class MyTextView { private String tit; private String wr_time; 21 cont,String wr_time){ package ; import ; import ty; import ; import ew; public class AboutUsActivity extends Activity { private TextView tv2,tv3; @Override =tit; _time=wr_time; =id; =cont; } public String getTit() { return tit; } public void setTit(String tit) { = tit; } public String getWr_time() { return wr_time; } public void setWr_time(String wr_time) { _time = wr_time; } private String cont; private int id; public String getCont() { return cont; } public void setCont(String cont) { = cont; } public int getId() { return id; } public void setId(int id) { = id; } public MyTextView(int id,String tit,String 22 bar if it is present. } } } } package ; import ar; import ice; import mHelper; import ; import ty; import anager; import ialog; import gIntent; import ckerDialog; import t; import ; import Preferences; import Database; import ; import ; import ; import kListener; import ; import ox; getMenuInflater().inflate(_us, menu); return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_about_us); tv2=(TextView) findViewById(_text); tv3=(TextView) findViewById(_text); t(" 测试软件的过程中"); t(" 如有问题或建议请联系我"); } 23 import ndButton; import utton; import utton; import roup; import kedChangeListener; import ew; import cker; import ; public class AlarmActivity extends Activity implements OnClickListener { void init() { ischeck = 0; // check_box = (CheckBox) findViewById(_box); radio_one = (RadioButton) findViewById(_one); radio_two = (RadioButton) findViewById(_two); tv = (TextView) findViewById(_text); init(); } @Override protected void onCreate(Bundle savedInstanceState) { te(savedInstanceState); setContentView(ty_alarm); private ImageButton imgbut; private RadioGroup rg; private Button but_ok, but_exit; private Calendar c; private TextView tv; private AlarmManager alarmManager; private PendingIntent pdintent; // private CheckBox check_box; private Intent myintent; private int isnew, ischeck; private Intent intent; private long longtime; private int num; private int hours, minutes, id; private String type; private RadioButton radio_one, radio_two; private int my_check = 1; private SQLiteDatabase db; private SharedPreferences prefs; 24 1 1 _LONG) _LONG) 启动服务 @Override public void onClick(View arg0) { // 对图标进行监听 switch (()) { case _but_checktime: { } case _exit: { } case _ok: { } } } private void setAlarm() { // 设置我选中的闹钟 alarmManager = (AlarmManager) intent = new Intent(, ); // pdintent = setAlarm(); (); xt(, "闹钟设置成功!!~", .show(); exitAlarm(); (); xt(, "设置的闹钟已取消", .show(); timeDialog(); // 显示对话框 break; break; break; getSystemService(_SERVICE); vice(,f(num), intent, _CANCEL_CURRENT); eInMillis() + longtime * 60 * 1000, pdintent); if (isnew == 2) { sql1 = "insert into if (my_check == 1) { (_WAKEUP, String sql1 = null; // num=tance().getTimeInMillis(); 1 my_alarm_time(num,type,hours,minute) values (" + ") "; ",minute=" + ") "; ",minute=" ); PendingIntent pdi = f(num), inte, vice(, private void exitAlarm() { // 设置取消定制的闹钟 if (isnew == 1) { String sql = "delete from my_alarm_time where id=" + id; Intent inte = new Intent(, } /* * if (ischeck != 1) { (pdintent); } */ if (isnew == 2) { } } num++; edit = (); ("my_count", num); (); } L(sql1); + minutes + ",type='every' where id=" + id; } else if (isnew == 1) { sql1 = "update my_alarm_time set hours=" + hours + } L(sql1); eating(_WAKEUP, eInMillis() + longtime * 60 * 1000, 24 * 60 * 60 * 1000, pdintent); + minutes + ",type='one' where id=" + id; } else if (isnew == 1) { sql1 = "update my_alarm_time set hours=" + hours + + num + ",'one'," + hours + "," + minutes } else if (my_check == 2) { if (isnew == 2) { sql1 = "insert into + num + ",'every'," + hours + "," + minutes my_alarm_time(num,type,hours,minute) values (" 2 _CANCEL_CURRENT); int arg2) { longtime, " + minutes + "分"); (), true); } le("选择闹钟的时间:"); (); } // (_OF_DAY, arg1); // (, arg2); } // _LONG).show(); t("你选定的时间是" + hours + "时 // TODO Auto-generated method stub // 当点击确定时,运行这个方法 hours = arg1; // 设置当前选择的时间 minutes = arg2; long time1, time2; time1 = hours * 60 + arg2; time2 = (_OF_DAY) * 60 } + (); if (time1 >= time2) { longtime = time1 - time2; longtime = 24 * 60 - time2 + time1; } else { private void timeDialog() { // 显示时间对话框 AlertDialog dg = new TimePickerDialog(, new SetListener() { @Override public void onTimeSet(TimePicker arg0, int arg1, } } AlarmManager am = (AlarmManager) (pdi); L(sql); Log.e("ok?", "删了没" + id); getSystemService(_SERVICE); // xt(, "" + }, (_OF_DAY), 3
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690318084a331802.html
评论列表(0条)