资源描述
杭州科技职业技术学院信息工程学院 毕业设计开题报告
毕业设计(论文)
题 目 个人心情日记本的设计
与实现
专 业 计算机网络技术
班 级 网络
学 号
姓 名
指导教师
2016 年 1 月 14 日
个人心情日记本
【摘要】据准确数据调查,全球人口已超过65亿,其中,互联网使用人数在2014年8月已超过二十亿。这就意味着,全球有三分之一的人在使用着互联网,其中,手机人数又是二分之一。打个比方,十个人里面就有三个人会使用互联网,而在这三个人里面又有一个人会选择用手机上网。
这样庞大的一个数据,已经足够说明互联网正在占领着全球化的趋势。根据这项调查,又有有关人员深入研究,在一百个人里面仅只有三个人会保持每天写日记的好习惯。为什么要有写日记的习惯呢?写日记不仅能帮助你记录每日所发生的事情,是你倾诉的好对象。因此,本人为了扩大写日记的人数,打算研究一项专门用于写日记的软件。该安卓项目的设计目的主要是为了满足正在逐渐发展的杭州科技职业技术学院,与大学城领域日渐增多的广大学生的需求。随着上大学时间增长,越来越发现找到一个有共同爱好,共同话题的朋友是多么的难得。从而造成了不少的学生不知道向谁吐槽心里话。或许有着小部分群体,依旧保持着手写日记的习惯,但随着手机越来越便捷化的发展,人们逐渐离不开了手机,这也就衍生了我想要研发一款手机日记本APP的浓厚兴趣。
本系统使用的是eclipse程序来编写Android代码,利用编程与SQLite数据库结构的有效结合,上下结合db与utils的关系,用的配置也是简单的BaseAdapter作为基础数据适配器,简单而又高效的进行开发。背景色调是选择最简单的小清新为主,不让客户产生厌烦的心理。为了更好的保护客户的隐私要求,进入日记本之后还可以选择设置密码,显得更为人性化的服务。此软件在使用过程中并不需要上网,因此也不会造成客户流量的浪费。虽然本项目只是一款基础的日记本,但是会在今后不断的探索中将功能与维护性进一步的修正、改造与完善,满足各类客户的需求。
【关键词】 Android SQLite eclipse BaseAdapter 密码 手机日记
目 录
引言 4
第一章 项目概述 5
1.1 项目设计背景 5
1.2 本人要完成的主要工作 6
第二章 项目设计 7
2.1 项目总体架构 7
2.2 数据库设计 7
第三章 各项目的设计与实现 9
3.1 项目初界面 9
3.2 主界面 10
3.2.1 写日记 11
3.2.2 查看日记 13
3.2.3 日记搜索 15
3.2.4 日记加密 17
3.3 更多功能 19
结论 20
致谢 21
参考文献 22
引 言
随着科技的进步与人们生活质量的提高,手机也成为了人们日常生活不可缺少的一部分。据准确数据调查,全球人口已超过65亿,其中,互联网使用人数在2014年8月已超过二十亿。这就意味着,全球有三分之一的人在使用着互联网,其中,手机人数又是二分之一。打个比方,十个人里面就有三个人会使用互联网,而在这三个人里面又有一个人会选择用手机上网。这样庞大的一个数据,已经足够说明互联网正在占领着全球化的趋势。根据这项调查,又有有关人员深入研究,在一百个人里面仅只有三个人会保持每天写日记的好习惯。相对于书本知识,人们更加与侧重与手机搜索,或是以打字来代替生活中的一些手写。其中,书信的减少就是最明显的一项变化。电话与短信以及现在更加流行的腾讯产品都成为了手机用户日常中重要的交流工具。随之也有着越来越多的生活中常用的东西被制作成APP软件,便于手机用户更加便捷的使用,其中个人日记本就是一项较为流行的成果。
Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android是由Linux+Java 构成的开源软件,允许所有厂商和个人在其基础上进行开发。Android 平台的开放性等特点既能促进技术(包括平台自身)的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定自己的特色化的产品。因此,它具有很大的市场发展潜力。
经过多年的发展, 第三代数字通信(3G)技术获得了广泛的接受,它为移动终端用户带来了更快的数据传输速率。随着3G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
第一章 项目概述
1.1 项目设计背景
Android是一个以Linux系统为基础的开源移动设备操作系统,主要用于智能手机和平板电脑,由Google成立的Open Handset Alliance持续领导与开发中。此外,现在Android已发布的最新版本为Android 6.0。
Android最初是由Andy Rubin等人开发制作,最初开发这个系统的主要目的是为了创建一个以数码相机为主的先进操作系统,但是后来随着时间的发现这在市场上的需求并不够大, 且加上智能手机市场快速成长,于是Android被改造为一款面向智能手机的操作系统。在2005年8月被美国科技企业Google收购。底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。不存在任何以往阻碍移动产业创新的专有权障碍,号称是首个为移动终端打造的真正开放和完整的移动软件。
Android手机是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,例如:手机。在2011年第一季度,Android手机在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。2014年第一季度,Android平台手机已占所有移动平台流量来源的42.8%,首都超越ios。
由以上数据可知,电子产品的日益扩大与发展,人们逐渐离不开了手机与电脑,基本上各个出门就是低头一族,为了延续与继承日记本的良好习性,本人逐渐衍生出要研发一款专门在手机上使用的个人日记。此个人日记本是一项基于人们往日手写日记的习惯制作而成,主要侧重于女生群体,以简单而又小清新的色调为主,能让用户在使用的时候心情能够更加的放松,并且此日记本并不需要消耗流量,能时时刻刻,想写就写。
每个人都会有着多多少少的小秘密,或是一些难以与人沟通的话语,那么就都可以倾诉给个人日记本。表露了自己的心情后,能释放心中的压力。如果有些密码不想让别人看到或者是担心谁误拿了自己的手机,怕被看到里面的日记,所以在设计时,体贴而又人性化的在设置中可以进行自行添加密码,是否需要添加密码,全由用户自主选择。当然,一旦你选择了添加密码,你便为为自己的小秘密增添了一份枷锁,谁也偷窥不到啦。
为了更加有真实感,特地模拟了实际日记本所特有的日期记录,使用时先说明今天年份月份及日子,讲述自己一天以来的所见所闻和感受,最后别忘了给自己这特殊的一天赋予一个心情,毕竟每个人每天的心情都会有所差别的。
写完日记记得返回主界面,除了写日记一个选项外,还有查看日记,搜索日记,设置密码三个主按钮。点击进入查看日记,你可以看到按日期排布的你以往所写的所有日记,偶尔看看其中一篇,顿时令你想起当日情景,这是多么美好的一件事件啊,帮你留住自己的记忆。如果你有一天突然想看一篇日记,但又想不起来具体日期了,那么你就选择搜索按钮,进入后输入关键字,进行全数据库搜索。这样是不是就能节省你不少的时间了?好处多多,想必关于设置密码也就不用过多介绍了吧,自主选择是否要对日记进行加密。
本日记本在设计方面,使用Android的Activity的布局及组件设计;使用Android的Intent组件完成各个Activity的数据传递及页面跳转; Java对象在互联网传输中的数据对象序列化。目的在于掌握Java手机应用开发技术和移动软件平台开发技术。像是在数据库DiaryDao中,分别放置了delete、search、insert、query来进行删除、查询、插入、获取功能。而在锁设置方面,有check、clear、getlock和savelock来检查、清除、获取密码、保存密码。在以Java语言为基础,结合Android移动开发平台,并利用Android提供的SDK,完成在Android平台上运行的“日记”查询软件,形成一款具有一定功能的手机应用软件。
个人日记本的使用,使用户减缓了心中的压力与不快,能够更好的与他人相处,促进了人与人之间的融洽。用它,于你,于他,于大家,人人和谐。
1.2 本人要完成的主要工作
在此次毕业作品设计中,本人主要需要做的是依据现有的Android编程技术设计一款适合安卓智能手机使用的日记本软件。使其数据能够即使记录,并在用户有需要的时候可以查看。将一个现实中的日记本完整的还原到手机端上。
在设计项目时,本人是在Java环境下,采用Eclipse开发环境,利用Android SDK插件模拟手机平台,使用各种课堂上学到的知识运用到软件中,完成所定制的各项功能。
该项目有专门设计的数据库,及时记录与保存用户每次所写的日记。
以上就是本人本次的工作任务。
第二章 项目设计
2.1 项目总体架构
该项目主要分为写日记、查看日记、搜索日记、设置密码、替换背景、用户帮助6个子模块。
个人心情日记本
open
设置密码
more
写日记
查看日记
搜索日记
退出
日期
心情
标题栏
正文
往日日记
搜索
帮助
无密码
数字密码
图
图2-1 项目设计图
2.2 数据库设计
本系统后台数据库选用SQLite数据库,数据库中有多张数据表,介于多数表格内容有相似重合的地方,所以为了方便浏览,仅简单的截取了两张数据表以供参考,这两张数据表分别是日记表(diary),密码表(lock)具体表结果如下:
日记表:diary
字段名
数据类型
说明
data
data
主键、自动增长
week
datetime
非空
diarytitle
varchar(255)
标题
title
varchar(255)
正文
feeling
varchar(40)
心情
密码表:lock
字段名
数据类型
说明
int
int
主键、自动增长
lock
varchar(40)
非空
确定 lock
double(6,2)
非空
No lock
Varcahr(40)
null
第三章 各项目的设计与实现
3.1 项目初界面
使用过只能手机App的用户都知道,每次登陆一个App都会有个最初的登录界面,所以在设计时,我也先进行设计了一个初级界面,如下图所示:
图3-1 open
因为只是一个简单的界面,只有一个按钮,所以代码也来的相对的简单,关键代码如下:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.open);
open = (Button)this.findViewById(R.id.open);
open.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sp=getSharedPreferences("pass", Context.MODE_PRIVATE);
String passWay=sp.getString("passway", null);
Intent i=new Intent(OpenActivity.this,MainActivity.class);
startActivityForResult(i, 0);
... ...
3.2 主界面
在主界面中放了五个按钮,分别为写日记、查看日记、日记搜索、日记加密、退出,另外在左下角还有一个小小的图标“more”,点击进入能够查看用户帮助,提供基本操作。
图3-2 主界面
以下为主界面的主要代码,先对文本中会用到的数据进行定义:
private void init() {
setContentView(R.layout.set_diary);
addDiary = (Button) this.findViewById(R.id.diary_add);
seeDiary = (Button) this.findViewById(R.id.see_diary);
searchDiary = (Button) this.findViewById(R.id.search_diary);
... ...
@Override
protected void onResume() {
super.onResume();
}
class MyListener implements OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.diary_add:
Intent intent = new Intent(MainActivity.this,
AddActivity.class);
startActivity(intent);
break;
}
... ...
//退出界面
private void exitDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.quit);
builder.setTitle(getString(R.string.quit));
builder.setMessage(getString(R.string.is_quit));
builder.setPositiveButton(getString(R.string.ok),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
builder.setNegativeButton(getString(R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.setCancelable(false);
builder.create().show();
}
... ...
3.2.1 写日记
点击“写日记”按钮,你会看到如下界面,分为日期部分,心情部分,标题部分,正文部分。其中心情部分区内共有六种心情,分别为开心、无奈、伤心、哭泣、生气、害羞。用户可以根据当天的心情选择适合自己的表情。
图3-3 写日记
如果你在任何东西都没填写的状态下按下返回键,那么会有提示框告诉你:“sorry,save fail!”
只有在填写了内容的情况下退出才会正常保存日记。
图3-4 保存失败
在代码方面其实并没有做特别多的功能,除了基本的文本,日期,时间等等外,就是在离开的时候进行了判断,判断是否有值在文本编辑框内放入,若是有,则退出时自动保存;若是没有,那么显示保存失败。
private void init() {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.add_diary);
preferences = getSharedPreferences("image", MODE_PRIVATE);
date = cal.getTime();
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
timeTextView = (TextView) this.findViewById(R.id.time);
timeTextView.setText(simpleDateFormat.format(date));
weekendTextView = (TextView) this.findViewById(R.id.weekend);
weekendTextView.setText(DateToWeek(date));
feelingSpinner = (Spinner) this.findViewById(R.id.feeling);
context = (EditText)this.findViewById(R.id.edit_diary_context);
diaryTitle = (EditText)this.findViewById(R.id.edit_title);
back = (ImageView)this.findViewById(R.id.back_add_diary);
back.setOnClickListener(new BackListener());
ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this,
R.array.feeling, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
feelingSpinner.setAdapter(adapter);
feelingSpinner.setPrompt(getString(R.string.feeling));
setBackground();
}
... ...
数据库方面代码如下:
public class Diary {
private String date;
private String weekend;
private String feeling;
private String context;
private String diaryTitle;
private int id;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getWeekend() {
return weekend;
}
... ...
@Override
public String toString() {
return "Diary [date=" + date + ", weekend=" + weekend + ", feeling="
+ feeling + ", context=" + context + ", diaryTitle="
+ diaryTitle + ", id=" + id + "]";
}
... ...
3.2.2 查看日记
当你点击“查看日记”按钮,并且此时里面并没有日记时,会出现如下提示框,当点击“确定”键,用户会直接跳转到写日记的界面。
图3-5 提示写日记
以下为查看日记界面的基本代码,当用户进入查看日记按钮后,程序会自行进行文本刷新,将所有文本按写的先后顺序排序出来。
private void init() {
setContentView(R.layout.set_info_diary);
diaryDao = new DiaryDao(this);
diaries = new ArrayList<Diary>();
back = (ImageView) this.findViewById(R.id.see_back_diary);
context = (ListView) this.findViewById(R.id.diary_list);
refresh();
myDialog();
back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
refresh();
};
IntentFilter iFilter = new IntentFilter();
iFilter.addAction("com.android.receivemsg");
iFilter.setPriority(Integer.MAX_VALUE);
// 注册广播接收器
registerReceiver(myReceiver, iFilter);
... ...
//用户所有的日记
private void myDialog() {
if (diaries.isEmpty() || diaries.size() < 0) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.prompt));//提示
builder.setIcon(R.drawable.warning);
builder.setMessage(getString(R.string.is_add_diary));
builder.setPositiveButton(getString(R.string.ok),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(SeeActivity.this,
AddActivity.class);
startActivity(intent);
finish();
unregisterReceiver(myReceiver);
}
});
builder.setNegativeButton(getString(R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
unregisterReceiver(myReceiver);
}
});
builder.setCancelable(false);
builder.create().show();
}
... ...
3.2.3 日记搜索
点击进入“日记搜索”界面,你会发现里面其实并没有什么东西,只有一个搜索框,只需将用户需要搜索的文本内容在文本框内输入,再点击左边的搜索按钮即可。将会将所有出现过关键字的所有日记都搜索出来。
图3-6 日记搜索
图3-14 日记搜索
关于日记搜索界面的关键代码,主要重点是放在编辑框的监听器上面,当监听器监听到有文本被放入进来了,就会对文本进行识别,再进行全日记搜查,直到找出相对应的日记。
//编辑框监听器
class SearchInfoListener implements TextWatcher{
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
class ItemLongPressListener implements OnItemLongClickListener{
@Override
public boolean onItemLongClick(AdapterView<?> parent, View v, final int position,
long id) {
AlertDialog.Builder builder = new AlertDialog.Builder(SearchActivity.this);
builder.setTitle(getString(R.string.op));
builder.setIcon(R.drawable.operate);
builder.setItems(new String[]{getString(R.string.share),getString(R.string.transmit), getString(R.string.delete),getString(R.string.backups),getString(R.string.empty)}, new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if (which == 0) {
Intent intent=new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.share));
intent.putExtra(Intent.EXTRA_TITLE, diaries.get(position).getDiaryTitle());
intent.putExtra(Intent.EXTRA_TEXT, diaries.get(position).getContext());
intent.setType("text/plain");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SearchActivity.this.startActivity(Intent.createChooser(intent, getTitle()));
dialog.dismiss();
... ...
AlertDialog.Builder builder = new AlertDialog.Builder(SearchActivity.this);
builder.setMessage(getString(R.string.delete_sure));
builder.setTitle(getString(R.string.delete));
builder.setIcon(getResources().getDrawable(R.drawable.delete));
builder.setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
// TODO Auto-generated method stub
diaryDao.delete(diaries.get(position).getId());
System.out.println("id ->"+diaries.get(position).getId());
refresh();
Toast.makeText(SearchActivity.this, getString(R.string.delete_over), Toast.LENGTH_SHORT).show();
dialogInterface.cancel();
Intent intent = new Intent();
intent.setAction("com.android.info.delete");
SearchActivity.this.sendBroadcast(intent);
}
});
... ...
@Override
public void onClick(DialogInterface dialogInterface, int which) {
String fileName = Time.getTime();
Stringinfo=diaries.get(position).getDiaryTitle()+
"\n"+diaries.get(position).getDate()+""+diaries.get(position).getWeekend()+" "+diaries.get(position).getFeeling()+"\n"+diaries.get(position).getContext();
if (FileWorking.wirteData(
fileName, info)) {
Toast.makeText(SearchActivity.this,
getString(R.string.save_success_sd),0).show();
} else {
Toast.makeText(SearchActivity.this,
getString(R.string.save_failed_sd),0).show();
}
... ...图3-15 日记搜索主代码
3.2.4 日记加密
在用户点击“日记加密”按钮后,会进入如下界面。可以选择是要‘数字密码’还是‘无密码’。
图3-7 日记加密
在点击“数字密码”界面后,会出现如下界面。会提示用户设置密码,并确认密码。
图3-8 设置密码
图3-17 设置密码
日记本整体设置采用了多个方法的监听器,因此,在设置密码这方面,同意也用到了监听器模块,专门针对是否有密码进行了监听。主要代码如下图显示:
class DigitalPassListener implements OnClickListener{
public void onClick(View v) {
LayoutInflater factory=LayoutInflater.from(SetPasswordActivity.this);
final View textEntry=factory.inflate(R.layout.digital_password, null);
AlertDialog.Builder builder=new AlertDialog.Builder(SetPasswordActivity.this)
.setTitle(getString(R.string.set_password)).setView(textEntry)
.setPositiveButton(getString(R.string.set), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
setpass=(EditText)textEntry.findViewById(R.id.set_password);
confirmpass=(EditText)textEntry.findViewById(R.id.confirm_password);
if (!confirmpass.
展开阅读全文