赞
踩
移动应用开发技术
期末考核报告
题 目: 基于android系统的备忘录
学生姓名
学 号
专 业
班 级
指导教师
2023 年 1 月 1 日
一、项目来源及背景3二、需求分析32.1业务需求分析32.2功能需求分析4三、系统总体设计43.1功能模块设计43.1.1备忘录基本操作43.1.2 备忘录主界面列表展示43.1.3 备忘录数据存储43.2数据库设计53.3界面设计53.3.1记事本主界面53.3.2 添加记录事项界面6四、详细设计与实现84.1 MyAdapter类84.2 NoteDbOpenHelper帮助类94.3 数据库的连接及表的交互工作104.4 AddActivity类124.5 EditActivity类144.6 layout页面布局154.6.1activity_main布局154.6.2 activity_add布局154.6.3activiti_edit布局164.6.4list_item_dialog_layout布局16五、总结与体会17
随着智能技术的发展和智能手机广泛普及,Android系统已占全球智能手机市场的25.5%,在中国市场的占有率则更高。在今天这个充斥着各种激烈竞争的重压时代,每个人都在忙碌的生活着。在我们的忙碌琐碎日常生活中,会有很多需要记忆的工作,我们需要一个能提醒和安排我们工作的东西,如何井井有条的处理和安排任务,在有限的时间内完成最紧急最重要的事情,备忘录对我们而言尤为重要,以便于及时提醒自己不要忘记,并且让自己可以在以后需要重复使用这些信息的时候可以更加的方便快捷。备忘录的基本功能就是记录信息,将不同的信息分门别类的记录下来,方便查询与修改。而现在想要随时携带纸笔记录是不方便也不现实的,很可能突然需要备忘录却没有带在身旁,所以就突出了备忘录app的重要性[1]。app不需要纸和笔,只要有手机就可以随时记录信息,并且分类别保存下来,这样可以大大的提升效率,更加方便快捷。
目前,手机一般都会有备忘录功能,且多数对备忘录的二次开发更多偏向于把备忘录设计得更加多元化,例如加人语音、闹钟、导航、分享等功能;虽然增加了备忘录功能的多元性,但是也使得备忘录的一些功能和其他软件有了重合,从而变相增加了竞品,且这些功能会让备忘录的开发成本和运行空间更大[2]。
本此课设设计的APP基于备忘录记述用户信息的基础功能特性,并让这个功能更加可靠,与此同时增添了背景音乐,使使用该app的人心情愉悦。
当今时代是信息爆炸的时代,随着工作与生活节奏的提速,工作和生活的所带来的的各种各样的繁多的信息正在全面侵袭着人们,如何避免忘记工作和生活中的诸多事情,能够随时随地的记录当前需要记录下来的信息与事件并且在事后可以方便的随时反复查看、避免遗忘重要的事情与信息就显得至关重要。
结合当今现实生活情况与自身能力我开发了一款基于Android系统的简单备忘录,其能够非常方便的记录生活和工作中的诸多事情,并分门别类的进行记录与保存,这样就可以非常方便的进行搜索与查看,可以针对不同类别的事件进行不同的统筹与安排,能够大大的提升人们在工作和生活中的效率,从而帮助人们有效地合理地进行时间管理。而Android作为当今世界使用面最广泛的手机系统之一,也是最适合作为开发软件的系统,此次应用开发也选择Android系统作为软件开发系统[3]。
此次的备忘录项目的目的与初衷是可以开发出一款符合该产品的使用用户在工作和生活中可以方便轻松快捷使用的操作简单明了的应用,能够满足用户在记录事件与查询自己所记录过的事件的各方面需求,可以对备忘录中的事件进行增加、查看、修改和删除功能,其中事件的显示与排列可以选择纵向布局和横向布局,来根据不同人的使用习惯与需求进行不同的设置,其次加入了背景音乐,缓解使用用户的疲倦。要求功能完善丰富并且具有良好的用户界面和交互体验。
①备忘录基本操作是该项目的核心部分,备忘录可进行记录·查看·删除·修改,保持了备忘录最基本的用途,提供备忘录动态更新的功能
②界面简洁明设计,功能简单能够让用户一目了然。
③添加了背景音乐——纯音乐,缓解用户的疲倦心理。
用户可能需要创建许多记事事项,并且需要对这些记录事项进行基本操作,备忘录的主界面展示能使用户界面更加简洁清晰,且给用户带来使用方便,用户可以选择纵向与横向两种布局。
备忘录最重要的功能就是记录和保存用户易遗忘的事件及其相关信息,为了持久地将用户记录事项信息保存下来,需要将这些信息存储到数据库中,备忘录本需要保存的信息字段有标题、事件内容和编写该事件的时间。
其功能模块图如图所示。
由上面的功能模块分析可知,本记事本项目的数据库设计主要包括三个字段名:标题titile、事件内容content和保存事件的时间createtime。
该界面包括右下角的添加按钮和右上角的查询按钮以及纵向布局与横向布局的排列布局切换按钮,备忘录主界面设计如下图所示。此外,我给该备忘录app设置了红色主题背景,如下图所示。一般的图片为jpg格式的,一定要把格式转化为png格式的。
确定无误后,我们只需要在main.xml中的LinearLayout下面,添加android:background="@drawable/background_srh"如上图所示,就可以设置主题背景了。
此外,为了使用户获得更好的app使用体验,我启动一个Service来负责后台播放音乐,将这个service绑定到Activity上,这样他俩的生命周期就相同了,Activity推出后音乐也会停止。我将歌曲放入raw文件夹下,名称命名为srh_music.mp3,并且在Activity中加入代码private Intent Serviceintent = new Intent("com.angel.Android.MUSIC");
并且在onCreate方法中加入startService(Serviceintent);这样,伴随着app的运行,背景音乐也会播放出来。退出的页面添加
protected void onDestroy() {//TODO Auto-generated method stubsuper.onDestroy();stopService(ServiceIntent);System.exit(0);} |
---|
该界面主要包括添加记事的标题以及内容按钮。记事本添加记录事项如下图所示。
如图,填入相应数据
自动在事件右边添加创建事件的时间
作为连接界面与后端代码的桥梁,MyAdapter类极其重要,它是一个适配器,用于对ListView进行数据适配。我们可以先创建MyAdapter类,再在MyAdapter类中创建一个ViewHolder类初始化Item界面中的控件,其中主要代码如下:
其主要代码如下:
public MyAdapter(Context context, List<Note> mBeanList){ this.mBeanList = mBeanList; this.mContext = context; mLayoutInflater = LayoutInflater.from(mContext); mNoteDbOpenHelper = new NoteDbOpenHelper(mContext);}public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if(viewType == TYPE_LINEAR_LAYOUT){ View view = mLayoutInflater.inflate(R.layout.list_item_layout, parent, false); MyViewHolder myViewHolder = new MyViewHolder(view); return myViewHolder; }else if(viewType == TYPE_GRID_LAYOUT){ View view = mLayoutInflater.inflate(R.layout.list_item_grid_layout, parent, false); MyGridViewHolder myGridViewHolder = new MyGridViewHolder(view); return myGridViewHolder; }return null;} |
---|
在备忘录程序中存储和读取记录的数据都是通过操作数据库完成的,我们需要创建NoteDbOpenHelper类实现对数据库中表的增删改查,定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,由于备忘录是与SqList数据库连接的,因此需要创建一个帮助类NoteDbOpenHelper类来与数据库进行连接并查询数据库内的数据。
具体代码如下:
SQLiteDatabase db = getWritableDatabase();List<Note> noteList = new ArrayList<>();Cursor cursor = db.query(TABLE_NAME_NOTE, null, null, null, null, null, null);if (cursor != null) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex("id")); String title = cursor.getString(cursor.getColumnIndex("title")); String content = cursor.getString(cursor.getColumnIndex("content")); String createTime = cursor.getString(cursor.getColumnIndex("create_time")); Note note = new Note();note.setId(id);note.setTitle(title); note.setContent(content); noteList.add(note); }cursor.close(); } |
---|
将其放进列表中在主界面中显示出来,并在实现后面的增删改查操作时都需要调用这个帮助类用以连接数据库,其中主要代码如下:
if (TextUtils.isEmpty(title)) return queryAllFromDb();SQLiteDatabase db = getWritableDatabase();List<Note> noteList = new ArrayList<>();Cursor cursor = db.query(TABLE_NAME_NOTE, null, "title like ?", new String[]{"%"+title+"%"}, null, null, null); if (cursor != null) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex("id")); String title2 = cursor.getString(cursor.getColumnIndex("title")); String content = cursor.getString(cursor.getColumnIndex("content")); String createTime = cursor.getString(cursor.getColumnIndex("create_time")); Note note = new Note(); note.setId(id); note.setTitle(title2); note.setContent(content);note.setCreatedTime(createTime);noteList.add(note);}cursor.close();} |
---|
由于其中含有过多的重复代码,例如访问数据库实现增删改查等功能。
其中查找操作实现的是模糊查找,只需要标题的关键字就可以进行查找,具体代码如下:
Cursor cursor = db.query(TABLE_NAME_NOTE, null, "title like ?", new String[]{"%"+title+"%"}, null, null, null); |
---|
在记事本程序中存储和读取记录的数据都是通过操作数据库完成的,我们需要创建SQLiteHelper类实现对数据库中表的增删改查,以及利用数据库中的工具类DBUtils来定义数据库的名称、表名、数据库版本、数据库表中的列名以及获取当前日期等信息,其主要代码如下:
创建数据库
利用提前编写好的固定语句,在创建数据库时直接引用提前编写好的语句参数作为创建数据库的参数进行创建:
private static final String DB_NAME = "noteSQLite.db";private static final String TABLE_NAME_NOTE = "note";private static final String CREATE_TABLE_SQL = "create table " + TABLE_NAME_NOTE + " (id integer primary key autoincrement, title text, content text, create_time text)";public NoteDbOpenHelper(Context context) {super(context, DB_NAME, null, 1);} |
---|
创建表
利用提前编写好的固定语句,在创建表时直接调用该语句进行创建:
@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_TABLE_SQL);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} |
---|
添加数据
将用户输入的各个数据传入相对应的参数并调用进添加数据函数,并使用db.insert传进数据库进行增加数据操作:
public long insertData(Note note) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put("title", note.getTitle()); values.put("content", note.getContent()); values.put("create_time", note.getCreatedTime()); return db.insert(TABLE_NAME_NOTE, null, values);} |
---|
删除数据
删除数据是根据添加数据时自动生成并且自增的字段“id”进行删除操作,依靠用户选择删除选项时对应的数据的“id”字段,这里的sql语句判别方式可以使用三种,分别为“=”、“is”或“like”,这里我们选择的是like方式:
public int deleteFromDbById(String id) { SQLiteDatabase db = getWritableDatabase(); return db.delete(TABLE_NAME_NOTE, "id = ?", new String[]{id}); return db.delete(TABLE_NAME_NOTE, "id is ?", new String[]{id}); return db.delete(TABLE_NAME_NOTE, "id like ?", new String[]{id}); } |
---|
修改数据
修改数据原理与删除数据类似,也是利用用户选择点击的那条数据对应的id号在数据库中进行数据匹配,并最终根据用户重新传入的数据进行数据的更新:
public int updateData(Note note) { SQLiteDatabase db = getWritableDatabase(); ContentValues values = new ContentValues(); values.put("title", note.getTitle()); values.put("content", note.getContent()); values.put("create_time", note.getCreatedTime()); return db.update(TABLE_NAME_NOTE, values, "id like ?", new String[]{note.getId()});} |
---|
查询数据
数据的查询与数据库内数据在app主界面的全部显示类似,不过查询操作采用的方法是模糊查找,利用标题title的关键字进行匹配查找:
Cursor cursor = db.query(TABLE_NAME_NOTE, null, "title like ?", new String[]{"%"+title+"%"}, null, null, null);if (cursor != null) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex("id")); String title2 = cursor.getString(cursor.getColumnIndex("title")); String content = cursor.getString(cursor.getColumnIndex("content")); String createTime = cursor.getString(cursor.getColumnIndex("create_time")); Note note = new Note(); note.setId(id); note.setTitle(title2); note.setContent(content); note.setCreatedTime(createTime); noteList.add(note); }cursor.close();} |
---|
备忘录中的添加功能在界面显示中需要一个单独的类来描述,主要用处是类之间参数的传导与各种操作相对应的提示等,其实现代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add); etTitle = findViewById(R.id.et_title); etContent = findViewById(R.id.et_content); mNoteDbOpenHelper = new NoteDbOpenHelper(this);} |
---|
其中标题为必填项,因为要根据标题内容进行查找操作,当标题为空时将会产生提示:
public void add(View view) { String title = etTitle.getText().toString(); String content = etContent.getText().toString(); if (TextUtils.isEmpty(title)) { ToastUtil.toastShort(this, "标题不能为空!"); return; } |
---|
将用户输入的数据内容传进参数并传递给数据库进行数据库相关方面的操作,当数据符合规则,即数据库内添加事件成功时将会产生“添加成功!”的Toast提示,反之将产生“添加失败”的Toast提示,要记得将其finish掉:
Note note = new Note(); note.setTitle(title); note.setContent(content); note.setCreatedTime(getCurrentTimeFormat()); long row = mNoteDbOpenHelper.insertData(note); if (row != -1) { ToastUtil.toastShort(this,"添加成功!"); this.finish(); }else {ToastUtil.toastShort(this,"添加失败!");} |
---|
该备忘录会自动产生生成该事件的时间,其方法为:
private String getCurrentTimeFormat() { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY年MM月dd HH:mm:ss"); Date date = new Date(); return simpleDateFormat.format(date);}} |
---|
EditActivity为修改备忘录中的事件所对应的类,我们在NoteDbOpenHelper中通过listView监听mNoteDbOpenHelper的点击事件,携带被点击的记录内容跳转到EditActivity中,其会根据获取的数据显示记录的内容。
代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_edit); etTitle = findViewById(R.id.et_title); etContent = findViewById(R.id.et_content); initData();} |
---|
EditActivity为修改备忘录中的事件所对应的类,其操作过程基本与AddActivity相同,其作为连接主界面的类,也会有相应的成功提示与错误提示。
标题为必填项,因为要根据标题内容进行查找操作,当标题为空时将会产生提示:
public void save(View view) { String title = etTitle.getText().toString(); String content = etContent.getText().toString(); if (TextUtils.isEmpty(title)) { ToastUtil.toastShort(this, "标题不能为空!");return;} |
---|
将用户输入的数据内容传进参数并传递给数据库进行数据库相关方面的操作,当数据符合规则,即数据库内添加事件成功时将会产生“修改成功!”的Toast提示,反之将产生“修改失败”的Toast提示,要记得将其finish掉:
note.setTitle(title);note.setContent(content); note.setCreatedTime(getCurrentTimeFormat());long rowId = mNoteDbOpenHelper.updateData(note);if (rowId != -1) { ToastUtil.toastShort(this, "修改成功!"); this.finish(); }else{ToastUtil.toastShort(this, "修改失败!"); } |
---|
同样的,修改备忘录内的事件时会相对应的自动产生修改该事件时所对应的时间,其方法与添加事件时产生时间的方法一样,为:
private String getCurrentTimeFormat() { SimpleDateFormat sdf = new SimpleDateFormat("YYYY年MM月dd日 HH:mm:ss"); Date date = new Date(); return sdf.format(date); } } |
---|
先确定布局,主界面需要显示所有事件,而且有横向布局和纵向布局两种选项,所以采用了FrameLayout布局再加上一个RecycleView用于以列表显示记事,下方添加一个FloatingActionButton按钮用于操控单击添加事件,代码如下:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"><androidx.recyclerview.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rlv"/> <com.google.android.material.floatingactionbutton.FloatingActionButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/ic_input_add" android:layout_gravity="right|bottom" android:layout_margin="20dp" android:onClick="add"/> |
---|
activity_add布局文件采用的是ScrollView布局和LinearLayout中穿插几个TextView与EditText,最后再来一个简单的Button,整体布局较为简单,是一个输入事件标题的文本框和一个输入事件内容的文本框以及底部的一个用于确认添加事件的按钮,代码如下所示(由于重复部分较多,故截取部分代码以作展示):
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dp"><TextView style="@style/MyTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="标题" /><EditText android:id="@+id/et_title" style="@style/MyEditStyle" android:maxLines="1" android:layout_width="match_parent" android:layout_marginLeft="5dp" /><Button style="@style/MyBtnStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="add" android:text="添加" /> |
---|
该布局为长按备忘录中的事件后弹出的编辑和删除的按钮布局,整体非常简单,是最基础的布局文件,采用LinearLayout布局,有“删除”和“编辑”两个选项,其部分代码如下:
<TextView android:layout_width="match_parent" android:id="@+id/tv_edit" android:text="编辑" style="@style/MyTextStyle"/> |
---|
在这次Android的大作业中,我自己完成了一个完整Android项目的编写——Android备忘录,这次完成Android课设与之前完成Android作业的感觉完全不一样,没有了平时实验的模板,它将之前学过的大量的知识串联起来,运用到了Android的控件、布局、Activity、Service等一系列基础知识,让我对Android这门课有了一个全面、深刻的理解。
当然,在本次课设中也遇上了许多的问题,同时,也学习了解到了相关的知识。比如Android系统中向下兼容性比较差与向下兼容性不好,不同版本的系统其API版本也不同,自然有些接口也不同,旧的平台也使用不了新的API,但是一个应用APP经过处理还是可以在各个版本间运行的。然后就是在增加背景音乐那里遇上了很长时间的麻烦,音乐路径和控件相关的问题,我在csdn上搜集了大量相关资料,最后才解决了问题。
这一次的课程设计我收获到了很多新的知识与新的体会,在做项目的过程中,我从0开始,一点一点的构思、编写,结合老师上课所教授的东西与网上查找的资料,对其进行理解最终成功完成了这个项目。在为期两周的时间里中,我大大增强了自己的自学能力与自身对知识的融会贯通能力,和同学、朋友交流了许多相关知识。
[1] 基于Android的记事本APP的设计与实现[J]. 张妍;李少元;李哲源;陈元忠;孙浩;冀炜.福建电脑,2017(07)
[2] 基于Android的红色印记APP的设计与实现[J]. 刘亚楠;包宇;董卓奇.信息系统工程,2022(09)
[3] 基于安卓系统的APP开发技术. 黄明月.电子技术与软件工程,2018
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。