闹钟提醒备忘录移动开发技术实验报告_第1页
闹钟提醒备忘录移动开发技术实验报告_第2页
闹钟提醒备忘录移动开发技术实验报告_第3页
闹钟提醒备忘录移动开发技术实验报告_第4页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、闹钟提醒备忘录移动开发技术实验报告 闹钟提醒备忘录移动开发技术实验报告 目录 第一部分:app 简介 . 2 (1) 需求分析 . 2 (2) 系统目标 . 2 (3) 开发及运行环境 . 2 第二部分:开发技术 . 3 (1)sharedprefenrences 技术 . 3 (2)数据库 . 11 (3)crud 操作 . 12 (4)时钟提醒 . 13 第三部分:功能介绍 . 15 (1)登录模块 . 15 (2)注册模块 . 16 (3)主界面模块 . 16 (4)新建备忘录模块 . 17 (5)删除备忘录模块 . 18 第四部分:遇到的问题和解决办法 . 20 (1)无法刷新 ui

2、. 20 (1)无法使用某些 api . 20 第五部分:总结 . 21 第一部分:app 简介 (1 1 ) 需求分析 随着时代的发展,我们每天需要处理的事务也呈现了爆炸式的增长。记住亲朋好友的生日并及时送上生日的祝福;记住上司布置的任务;记住几天后的出行车票时间等,这些纷繁的信息记忆是不是正在让您深陷其中?目前,手机上已经有了备忘录功能和闹钟功能,但二者之间并没有实现消息的互通(苹果手机用户可以设置事件的闹钟提醒,但是安卓用户却还没有使用这样的功能)。用户在备忘录中记录下需要设置时间提醒事件后,还需要再打开闹钟app,并设置闹钟提醒,这在无形中增加了用户的负担,并且产生了糟糕的用户体验。

3、现在,这些都不再是问题,在本次的课程设计中,使用我的软件,用户可以十分方便的新建备忘录,根据标题查找备忘录事件,删除已过期的备忘录并可以随意修改备忘录内容。除此之外,用户还可以为每条事件添加重要程度,并在主界面按重要程度展示所有的已建备忘录列表本软件致力于帮助用户时刻记录下生活中的重要信息并在设置的时间给用户发送提醒,让您不缺席生活中的重要时刻。 (2 2 ) 系统目标 1,友好的操作界面和良好的人机互动。 2,软件的登录界面保证了信息的保密性。 3,随时对重要信息的记录并设置到时间提醒。 4,备忘录内容的修改,删除和查询。 5,也可将其用作记录本使用,代替原有的单一备忘录 app。 6,系统

4、可靠运行,安全有效。 (3 3 ) 开发及运行环境 (1) 开发工具:android studio (2) 系统环境:windows 10 家庭中文版 (3) 开发语言:java,xml 第二部分:开发技术 (1 1 ) sharedprefenrences s 技术 在用户第一次进入软件时,可以注册个人账号,包括账号和密码;密码须二次输入同样的字符,否则无法注册成功;账号和密码使用 sharedprefenrence 技术保存。保存用户的账号密码,属于用户的偏好参数,若使用数据库来存储这些数据,未免有些大材小用,此时 sharedpreferences 技术就派上用场。sharedprefe

5、rences 使用键-值的形式来存储数据。在我们的实例中,账号为键,密码为值,具有唯一匹配性,我们只需要调用 sharedpreferences 的getxxx(name), 就可以根据键获得对应的值。使用起来很方便! 登录界面源码: package com.example.uilayouttest.activity; import android.content.intent; import android.content.sharedpreferences; import android.content.pm.activityinfo; import android.support.v7.

6、app.actionbar; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.text.textutils; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.textview; import android.widget.toast; import com.example.uilayouttes

7、t.adapter.md5utils; import com.example.uilayouttest.r; public class loginactivity extends appcompatactivity private textview tv_main_title;/标题 private textview tv_back,tv_register,tv_find_psw;/返回键,显示的注册,找回密码 private button btn_login;/登录按钮 private string username,psw,sppsw;/获取的用户名,密码,加密密码 private edi

8、ttext et_user_name,et_psw;/编辑框 override protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.activity_login); /设置此界面为竖屏 setrequestedorientation(activityinfo.screen_orientation_portrait); init(); actionbar actionbar=getsupportactionbar(); if(a

9、ctionbar!=null) actionbar.hide(); /获取界面控件 private void init() /从 main_title_bar 中获取的 id tv_main_title=findviewbyid(r.id.tv_main_title); tv_main_title.settext(登录); tv_back=findviewbyid(r.id.tv_back); /从 activity_login.xml 中获取的 tv_register=findviewbyid(r.id.tv_register); tv_find_psw=findviewbyid(r.id.

10、tv_find_psw); btn_login=findviewbyid(r.id.btn_login); et_user_name=findviewbyid(r.id.et_user_name); et_psw=findviewbyid(r.id.et_psw); /返回键的点击事件 tv_back.setonclicklistener(new view.onclicklistener() override public void onclick(view v) /登录界面销毁 loginactivity.this.finish(); ); /立即注册控件的点击事件 tv_register.

11、setonclicklistener(new view.onclicklistener() override public void onclick(view v) /为了跳转到注册界面,并实现注册功能 intent intent=new intent(loginactivity.this,registeractivity.class); startactivityforresult(intent, 1); ); /找回密码控件的点击事件 tv_find_psw.setonclicklistener(new view.onclicklistener() override public void

12、 onclick(view v) /跳转到找回密码界面(此页面暂未创建) ); /登录按钮的点击事件 btn_login.setonclicklistener(new view.onclicklistener() override public void onclick(view v) /开始登录,获取用户名和密码 gettext().tostring().trim(); username=et_user_name.gettext().tostring().trim(); psw=et_psw.gettext().tostring().trim(); /对当前用户输入的密码进行 md5 加密再

13、进行比对判断, md5utils.md5( ); psw 进行加密判断是否一致 string md5psw= md5utils.md5(psw); / md5psw ; sppsw 为 根据从 sharedpreferences 中用户名读取密码 / 定义方法 readpsw 为了读取用户名,得到密码 sppsw=readpsw(username); / textutils.isempty if(textutils.isempty(username) toast.maketext(loginactivity.this, 请输入用户名, toast.length_short).show(); r

14、eturn; else if(textutils.isempty(psw) toast.maketext(loginactivity.this, 请输入密码, toast.length_short).show(); return; / md5psw.equals(); 判断,输入的密码加密后,是否与保存在 sharedpreferences 中一致 else if(md5psw.equals(sppsw) /一致登录成功 toast.maketext(loginactivity.this, 登录成功, toast.length_short).show(); /保存登录状态,在界面保存登录的用户

15、名 定义个方法 saveloginstatus boolean 状态 , username 用户名; saveloginstatus(true, username); /登录成功后关闭此页面进入主页 intent data=new intent(); /datad.putextra( ); name , value ; data.putextra(islogin,true); /result_ok 为 activity 系统常量,状态码为-1 / 表示此页面下的内容操作成功将 data 返回到上一页面,如果是用 back 返回过去的则不存在用 setresult 传递 data 值 setre

16、sult(result_ok,data); /销毁登录界面 loginactivity.this.finish(); /跳转到主界面,登录成功的状态传递到 mainactivity 中 startactivity(new intent(loginactivity.this, mainactivity.class); return; else if(sppsw!=null!textutils.isempty(sppsw)!md5psw.equals(sppsw) toast.maketext(loginactivity.this, 输入的用户名和密码不一致, toast.length_short

17、).show(); return; else toast.maketext(loginactivity.this, 此用户名不存在, toast.length_short).show(); ); /* *从 sharedpreferences 中根据用户名读取密码 */ private string readpsw(string username) /getsharedpreferences(logininfo,mode_private); /logininfo,mode_private; mode_private 表示可以继续写入 sharedpreferences sp=getshared

18、preferences(logininfo, mode_private); /sp.getstring() username, ; return sp.getstring(username , ); /* *保存登录状态和登录用户名到 sharedpreferences 中 */ private void saveloginstatus(boolean status,string username) /saveloginstatus(true, username); /logininfo 表示文件名 sharedpreferences sp=getsharedpreferences(login

19、info, mode_private); sharedpreferences sp=getsharedpreferences(logininfo, mode_private); /获取编辑器 sharedpreferences.editor editor=sp.edit(); /存入 boolean 类型的登录状态 editor.putboolean(islogin, status); /存入登录状态时的用户名 editor.putstring(loginusername, username); /提交修改 mit(); /* * 注册成功的数据返回至此 * param requestcode

20、 请求码 * param resultcode 结果码 * param data 数据 */ override /显示数据, onactivityresult /startactivityforresult(intent, 1); 从注册界面中获取数据 /int requestcode , int resultcode , intent data / loginactivity - startactivityforresult - onactivityresult(); protected void onactivityresult(int requestcode, int resultcod

21、e, intent data) /super.onactivityresult(requestcode, resultcode, data); super.onactivityresult(requestcode, resultcode, data); if(data!=null) /是获取注册界面回传过来的用户名 / getextra().getstring(*); string username=data.getstringextra(username); if(!textutils.isempty(username) /设置用户名到 et_user_name 控件 et_user_nam

22、e.settext(username); /et_user_name 控件的 setselection()方法来设置光标位置 et_user_name.setselection(username.length(); 注册界面源码如下: package com.example.uilayouttest.activity; import android.content.intent; import android.content.sharedpreferences; import android.content.pm.activityinfo; import android.graphics.co

23、lor; import android.support.v7.app.actionbar; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.text.textutils; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.relativelayout; import android.widget.

24、textview; import android.widget.toast; import com.example.uilayouttest.adapter.md5utils; import com.example.uilayouttest.r; public class registeractivity extends appcompatactivity private textview tv_main_title;/标题 private textview tv_back;/返回按钮 private button btn_register;/注册按钮 /用户名,密码,再次输入的密码的控件 p

25、rivate edittext et_user_name,et_psw,et_psw_again; /用户名,密码,再次输入的密码的控件的获取值 private string username,psw,pswagain; /标题布局 private relativelayout rl_title_bar; override protected void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); /设置页面布局 ,注册界面 setcontentview(r.layout.activity_reg

26、ister); /设置此界面为竖屏 / actionbar actionbar = getsupportactionbar(); / if (actionbar != null) / actionbar.hide(); setrequestedorientation(activityinfo.screen_orientation_portrait); init(); private void init() /从 main_title_bar.xml 页面布局中获取对应的 ui 控件 tv_main_title=findviewbyid(r.id.tv_main_title); / tv_mai

27、n_title.settext(注册); tv_back=findviewbyid(r.id.tv_back); /布局根元素 rl_title_bar=findviewbyid(r.id.title_bar); / rl_title_bar.setbackgroundcolor(color.transparent); /从 activity_register.xml 页面中获取对应的 ui 控件 btn_register=findviewbyid(r.id.btn_register); et_user_name=findviewbyid(r.id.et_user_name); et_psw=

28、findviewbyid(r.id.et_psw); et_psw_again=findviewbyid(r.id.et_psw_again); button btnback=findviewbyid(r.id.btn_backtologin); btnback.setonclicklistener(new view.onclicklistener() override public void onclick(view v) startactivity(new intent(registeractivity.this,loginactivity.class); ); / tv_back.set

29、onclicklistener(new view.onclicklistener() / override / public void onclick(view v) / /返回键 / registeractivity.this.finish(); / / ); /注册按钮 btn_register.setonclicklistener(new view.onclicklistener() override public void onclick(view v) /获取输入在相应控件中的字符串 geteditstring(); /判断输入框内容 if(textutils.isempty(use

30、rname) toast.maketext(registeractivity.this, 请输入用户名, toast.length_short).show(); return; else if(textutils.isempty(psw) toast.maketext(registeractivity.this, 请输入密码, toast.length_short).show(); return; else if(textutils.isempty(pswagain) toast.maketext(registeractivity.this, 请再次输入密码, toast.length_sho

31、rt).show(); return; else if(!psw.equals(pswagain) toast.maketext(registeractivity.this, 输入两次的密码不一样, toast.length_short).show(); return; /* *从 sharedpreferences 中读取输入的用户名,判断sharedpreferences 中是否有此用户名 */ else if(isexistusername(username) toast.maketext(registeractivity.this, 此账户名已经存在, toast.length_sho

32、rt).show(); return; else toast.maketext(registeractivity.this, 注册成功, toast.length_short).show(); /把账号、密码和账号标识保存到 sp 里面 /* * 保存账号和密码到 sharedpreferences 中 */ saveregisterinfo(username, psw); /注册成功后把账号传递到 loginactivity.java 中 / 返回值到 loginactivity 显示 intent data = new intent(); data.putextra(username, u

33、sername); setresult(result_ok, data); /result_ok 为 activity 系统常量,状态码为-1, / 表示此页面下的内容操作成功将 data 返回到上一页面,如果是用 back 返回过去的则不存在用 setresult 传递 data 值 registeractivity.this.finish(); ); /* * 获取控件中的字符串 */ private void geteditstring() username=et_user_name.gettext().tostring().trim(); psw=et_psw.gettext().to

34、string().trim(); pswagain=et_psw_again.gettext().tostring().trim(); /* * 从 sharedpreferences 中读取输入的用户名,判断 sharedpreferences 中是否有此用户名 */ private boolean isexistusername(string username) boolean has_username=false; /mode_private sharedpreferences sp = getsharedpreferences( ); / logininfo, mode_private

35、 sharedpreferences sp=getsharedpreferences(logininfo, mode_private); /获取密码 string sppsw=sp.getstring(username, );/传入用户名获取密码 /如果密码不为空则确实保存过这个用户名 if(!textutils.isempty(sppsw) has_username=true; return has_username; /* * 保存账号和密码到 sharedpreferences 中 sharedpreferences */ private void saveregisterinfo(st

36、ring username,string psw) string md5psw = md5utils.md5(psw);/把密码用 md5 加密 /logininfo 表示文件名, mode_private sharedpreferences sp = getsharedpreferences( ); sharedpreferences sp=getsharedpreferences(logininfo, mode_private); /获取编辑器, sharedpreferences.editor editor - sp.edit(); sharedpreferences.editor ed

37、itor=sp.edit(); /以用户名为 key,密码为 value 保存在 sharedpreferences 中 /key,value,如键值对,editor.putstring(用户名,密码); editor.putstring(username, md5psw); /提交修改 mit(); mit(); (2 2 )数据库 本软件使用 sqlite 轻量级数据库,在创建数据库时,是通过使用sqliteopenhelper 类的构造函数实现 代码如下: public class dbopenhelper extends sqliteopenhelper private static

38、final string tag = dbopenhelper.class.getsimplename(); private static final int version = 1; private static final string db_name = memo.db; public dbopenhelper() super(memoapplication.getcontext(), db_name, null, version); override public void oncreate(sqlitedatabase db) /*第一次初始化 app,创建表结构 */ db.exe

39、csql(create table if not exists + columncontacts.event_table_name + ( + basecolumns._id + integer primary key autoincrement, + columncontacts.event_title_column + text, + columncontacts.event_content_column + text, + columncontacts.event_created_time_column + datetime, + columncontacts.event_updated

40、_time_column + datetime, + columncontacts.event_remind_time_column + datetime, + columncontacts.event_is_important_column + integer, + columncontacts.event_is_clocked + integer + ); (3 3 )c c rud 操作 使用 eventdao 类实现添加,查询,删除等操作 代码如下: 1,查询操作: public listevent findall() /降序排列,按重要性和创建时间 string sql = sele

41、ct * from + columncontacts.event_table_name + order by + columncontacts.event_is_important_column + desc, + columncontacts.event_created_time_column + desc; return mtemplate.query(sql, mcallback); public listevent findallwithnoclocked() string sql = select * from + columncontacts.event_table_name +

42、where + columncontacts.event_is_clocked + = + constants.eventclockflag.none; return mtemplate.query(sql, mcallback); 2,添加操作: public int create(event event) return (int) mtemplate.create(columncontacts.event_table_name, generatecontentvalues(event, false); 3,更新操作: public int update(event event) retur

43、n mtemplate.update(columncontacts.event_table_name, generatecontentvalues(event, true), basecolumns._id + = ?, integer.tostring(event.getmid(); 4,删除操作 public int remove(listinteger ids) stringbuilder whereconditions = new stringbuilder(basecolumns._id + in(); for (integer id : ids) whereconditions.a

44、ppend(id).append(,); whereconditions.deletecharat(whereconditions.length() - 1).append(); return mtemplate.remove(columncontacts.event_table_name, whereconditions.tostring(); (4 4 )时钟提醒 在退出软件后,为了让我们的提醒服务在后台保活,编写 clockservice 类在后台运行。 代码如下: public class clockservice extends service private static fina

45、l string tag = clockservice; public static final string extra_event_id = extra.event.id; public static final string extra_event_remind_time = extra.event.remind.time; public static final string extra_event = extra.event; private eventdao meventdao = eventdao.getinstance(); public clockservice() log.

46、d(tag, clockservice: constructor); override public ibinder onbind(intent intent) throw new unsupportedoperationexception(not yet implemented); override public int onstartcommand(intent intent, int flags, int startid) log.d(tag, onstartcommand: onstartcommand); wakelockutil.wakeupandunlock(); posttoc

47、lockactivity(getapplicationcontext(), intent); return super.onstartcommand(intent, flags, startid); private void posttoclockactivity(context context, intent intent) intent i = new intent(); i.setclass(context, clockactivity.class); i.putextra(extra_event_id, intent.getintextra(extra_event_id, -1); event event = meventdao.findbyid(intent.getintextra(extra_event_id, -1); if (event = null) return; i.pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论