收藏 分销(赏)

基于Android的手机备忘录软件设计.doc

上传人:仙人****88 文档编号:8943448 上传时间:2025-03-08 格式:DOC 页数:25 大小:270.54KB 下载积分:10 金币
下载 相关 举报
基于Android的手机备忘录软件设计.doc_第1页
第1页 / 共25页
基于Android的手机备忘录软件设计.doc_第2页
第2页 / 共25页


点击查看更多>>
资源描述
课程设计报告 (本科) 课程: 嵌入式系统 学号: 姓名: 班级: 教师: 时间: 2013年5月3日至6月20日 计算机科学与技术系 设计名称: 基于Android的手机备忘录软件设计 设计内容、目的与要求: 一.目的:  利用所学《嵌入式Linux应用开发》课程所学知识,针对实际问题,基于Android系统平台研发出具有实际应用价值的备忘录。  主要内容:  (1)基于Android系统平台研发出备忘录;  (2)通过安装备忘录,防止手机用户遗忘某个时间的重要工作,进行记录并在特定时间通过声音,文字或振动提醒用户;  (3)主要模块有:备忘录数据存储、数据共享访问、列表浏览、数据维护和定时提醒等模块。   二.基本要求  (1)基于Android系统平台研发出备忘录,以防止手机用户遗忘某个时间的重要工作,进行记录并在特定时间通过声音,文字或振动提醒用户。  (2)主要设计出备忘录数据存储、数据共享访问、列表浏览、数据维护和定时提醒等模块。已学习掌握Android系统平台和Java编程技术,并要求软件界面简洁专业,功能完善,真正为用户提供重要工作备忘功能。 计划与进度安排: 5月 3日~5月15日: 完成设计思路并作出草稿; 5月16日~6月1日: 完成程序的输入; 6月2日~6月10日: 完成对基本功能的修改并运行无误; 6月11日~6月21日: 增加对开始的源程序的功能; 6月22日~6月26日: 修改并完成,提交验收; 设计过程、步骤(可加页): 一. 功能结构 开始 设置是否开启 设置时间 备忘录内容 结束 开启闹钟 二. 设计说明 1. 备忘录数据存储实现 为了持久地将用户的备忘录信息保存下来,需要将这些信息存储在SQLite数据库中。备忘录需要保存的信息有:编号(ID)、提醒日起(Datel)、提醒时间(Time1)、提醒内容(Content)、是否启用(NO_OFF)、是否声音提醒(Alarm)、创建日期(Created)等。 在操作北往里数据表手机,一些属性在几个类中使用,为此我们将其定义为一个常量类,在该常量类中声明。常量类名称为TaskList,该类有一个内部Tasks继承BaseColumns,在该类中声明URI和列常量等,方便后面使用。 2. 备忘录ContentProvidershi实现 为了使备忘录数据表具有通用的数据共享访问机制,需要通过ContentProvider来实现。这里我们定义一个TaskListProvide类,该类继承ContentProvider,实现了onCreate、query、getType、insert、deleted、update等方法,来支持数据的增、删、查、改等操作。 3. 备忘录列表展示 用户可能哟呵常见很多条备忘录信息,而且需要维护这些备忘录信息,例如删除、修改等功能。这里我们通过一个ListView来展示备忘录列表,通过选项菜单提供微幅数据借口。 4. 备忘录维护 备忘录维护是应该用程序的核心,提供了添加、修改备忘录信息的功能。备忘录信息也通过ListView来展示,ListView的每一项通过自定义View来实现。通过单击ListView的每一项来设置备忘录信息。 5. 备忘录定时提醒 为了更好的提醒用户在特定时间做某项工作,要设置语音和震动等功能,该功能通过定义Activity发出广播,BroadcastReceiver接收广播,并通过Notification提醒用户。 6. 程序运行 结果与分析(可以加页): 1. 列表展示 主要功能把备忘录界面展示给用户,用户可以添加和删除备忘录信息,很大程度上方便了用户的操作。 运行结果 2. 备忘录维护 用户可以很好的将需要或者不需要的备忘录信息进行增添或者删除 运行结果: 3. 备忘录定时提醒 这个功能可以很有效的提醒用户关闭备忘录,以免造成不必要的资源浪费。 运行结果: 设计体会与建议: 这个课程设计主要研究了Android平台的架构以及在Android平台上开发备忘录软件, 此应用除了具备简单备忘功能外,还具备简单数据处理功能,还有闹钟提醒相对高级点的功能。这个课程设计在Android平台以及在该平台上开发手机备忘录软件上做了大量的工作,但因个人能力有限,还有很多问题需要解决,现对未来可以进行的工作做出以下几点感言: (l)这个课程设计实现的备忘录客户端是基于Android平台进行开发的,但是还未能真正解析Android的精髓,系统的界面设计也不是很完善,对Android平台进一步研究,能够使系统在设计方面更加快捷和完善。 (2)这个课程设计所开发的系统目前还只是在模拟器上进行运行,还有待移植到真机上进行进一步研究。相信随着研究的进一步深入,这些问题会逐步得到解决,相信基于Android平台的备忘录软件会有很好的应用前景。 附录:源程序代码 1. AlarmActivity.java package com.amaker.ch17.app; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import .Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * @author 冯春礼 * 提醒用户 */ public class AlarmActivity extends Activity { public static final int ID = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.alarm); // 获得Button、TextView实例 Button btn = (Button) findViewById(R.id.cancelButton01); TextView tv = (TextView)findViewById(R.id.msgTextView01); // 获得NotificationManager实例 String service = Context.NOTIFICATION_SERVICE; final NotificationManager nm = (NotificationManager)getSystemService(service); // 实例化Notification Notification n = new Notification(); // 设置显示提示信息,该信息也会在状态栏显示 String msg = getIntent().getStringExtra("msg"); // 显示时间 n.tickerText = msg; tv.setText(msg); // 设置声音提示 n.sound = Uri.parse("file:///sdcard/fallbackring.ogg"); // 发出通知 nm.notify(ID, n); // 取消通知 btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { nm.cancel(ID); finish(); } }); } } 2. TaskDetailActivity.java package com.amaker.ch17.app; import java.util.Calendar; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.Dialog; import android.app.ListActivity; import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.ContentUris; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import .Uri; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.CheckedTextView; import android.widget.DatePicker; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.TimePicker; import android.widget.AdapterView.OnItemClickListener; import com.amaker.ch17.app.TaskList.Tasks; /** * * @author 冯春礼 * 备忘录详细信息类,该信息 */ public class TaskDetailActivity extends ListActivity { // 备忘录信息列表 private ListView listView = null; // 提醒日期 private int mYear; private int mMonth; private int mDay; // 提醒时间 private int mHour; private int mMinute; // 日期显示TextView private TextView dateName, dateDesc; // 时间显示TextView private TextView timeName, timeDesc; // 提醒内容TextView private TextView contentName, contentDesc; // 是否开启提醒 private int on_off = 0; // 是否声音警告 private int alarm = 0; // 显示日期、时间对话框常量 static final int DATE_DIALOG_ID = 0; static final int TIME_DIALOG_ID = 1; // 保存内容、日期、时间字符串 private String content, date1, time1; // 备忘录ID private int id1; // 多选框 private CheckedTextView ctv1, ctv2; // 访问布局实例 private LayoutInflater li; // 初始化方法 private void init(Intent intent) { Bundle b = intent.getBundleExtra("b"); if (b != null) { id1 = b.getInt("id"); content = b.getString("content"); date1 = b.getString("date1"); time1 = b.getString("time1"); on_off = b.getInt("on_off"); alarm = b.getInt("alarm"); if (date1 != null && date1.length() > 0) { String[] strs = date1.split("/"); mYear = Integer.parseInt(strs[0]); mMonth = Integer.parseInt(strs[1]); mDay = Integer.parseInt(strs[2]); } if (time1 != null && time1.length() > 0) { String[] strs = time1.split(":"); mHour = Integer.parseInt(strs[0]); mMinute = Integer.parseInt(strs[1]); } } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获得ListView listView = getListView(); // 实例化LayoutInflater li = getLayoutInflater(); // 设置ListView Adapter listView.setAdapter(new ViewAdapter()); // 可多选 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); // 获得Calendar实例 final Calendar c = Calendar.getInstance(); // 获得当前日期、时间 mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get(Calendar.DAY_OF_MONTH); mHour = c.get(Calendar.HOUR_OF_DAY); mMinute = c.get(Calendar.MINUTE); // 响应列表单击事件 listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> av, View v, int position, long id) { switch (position) { // 设置是否开启提醒 case 0: ctv1 = (CheckedTextView) v; if (ctv1.isChecked()) { on_off = 0; } else { on_off = 1; } break; // 设置提醒日期 case 1: showDialog(DATE_DIALOG_ID); break; // 设置提醒时间 case 2: showDialog(TIME_DIALOG_ID); break; // 设置提醒内容 case 3: showDialog1("请输入内容:"); break; // 设置是否开启语音提醒 case 4: ctv2 = (CheckedTextView) v; if (ctv2.isChecked()) { alarm = 0; setAlarm(false); } else { alarm = 1; setAlarm(true); } break; default: break; } } }); } @Override protected void onResume() { super.onResume(); // 初始化列表 init(getIntent()); } // ListView Adatper,该类实现了列表的每一项通过自定义视图实现 class ViewAdapter extends BaseAdapter { // 列表显示内容 String[] strs = { "是否开启", "日期", "时间", "内容", "开启闹钟" }; // 获得列表列数 @Override public int getCount() { return strs.length; } // 返回列表项 @Override public Object getItem(int position) { return position; } // 返回列表ID @Override public long getItemId(int position) { return position; } // 获得当前列表项视图 @Override public View getView(int position, View convertView, ViewGroup parent) { View v = li.inflate(R.layout.item_row, null); switch (position) { // 是否开启该条备忘录 case 0: ctv1 = (CheckedTextView) li .inflate( android.R.layout.simple_list_item_multiple_choice, null); ctv1.setText(strs[position]); if (on_off == 0) { ctv1.setChecked(false); } else { ctv1.setChecked(true); } return ctv1; // 提醒日期 case 1: dateName = (TextView) v.findViewById(R.id.name); dateDesc = (TextView) v.findViewById(R.id.desc); dateName.setText(strs[position]); dateDesc.setText(mYear + "/" + mMonth + "/" + mDay); return v; // 提醒时间 case 2: timeName = (TextView) v.findViewById(R.id.name); timeDesc = (TextView) v.findViewById(R.id.desc); timeName.setText(strs[position]); timeDesc.setText(mHour + ":" + mMinute); return v; // 提醒内容 case 3: contentName = (TextView) v.findViewById(R.id.name); contentDesc = (TextView) v.findViewById(R.id.desc); contentName.setText(strs[position]); contentDesc.setText(content); return v; // 是否声音提示 case 4: ctv2 = (CheckedTextView) li .inflate( android.R.layout.simple_list_item_multiple_choice, null); ctv2.setText(strs[position]); if (alarm == 0) { ctv2.setChecked(false); } else { ctv2.setChecked(true); } return ctv2; default: break; } return null; } } // 显示对话框 @Override protected Dialog onCreateDialog(int id) { switch (id) { // 显示日期对话框 case DATE_DIALOG_ID: return new DatePickerDialog(this, mDateSetListener, mYear, mMonth, mDay); // 显示时间对话框 case TIME_DIALOG_ID: return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute, false); } return null; } // 设置通知提示 private void setAlarm(boolean flag) { final String BC_ACTION = "com.amaker.ch17.TaskReceiver"; // 获得AlarmManager实例 final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); // 实例化Intent Intent intent = new Intent(); // 设置Intent action属性 intent.setAction(BC_ACTION); intent.putExtra("msg", content); // 实例化PendingIntent final PendingIntent pi = PendingIntent.getBroadcast( getApplicationContext(), 0, intent, 0); // 获得系统时间 final long time1 = System.currentTimeMillis(); Calendar c = Calendar.getInstance(); c.set(mYear, mMonth, mDay, mHour, mMinute); long time2 = c.getTimeInMillis(); if (flag&&(time2-time1)>0&&on_off==1){ am.set(AlarmManager.RTC_WAKEUP, time2, pi); }else{ am.cancel(pi); } } /* * 设置提示日期对话框 */ private void showDialog1(String msg) { View v = li.inflate(R.layout.item_content, null); final EditText contentET = (EditText) v.findViewById(R.id.content); contentET.setText(content); new AlertDialog.Builder(this).setView(v).setMessage(msg).setCancelable( false).setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { content = contentET.getText().toString(); contentDesc.setText(content); } }).show(); } // 时间选择对话框 private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { mHour = hourOfDay; mMinute = minute; timeDesc.setText(mHour + ":" + mMinute); } }; // 日期选择对话框 private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { mYear = year; mMonth = monthOfYear; mDay = dayOfMonth; dateDesc.setText(mYear + "/" + mMonth + "/" + mDay); } }; // 保存或修改备忘录信息 protected void onPause() { super.onPause(); saveOrUpdate(); }; // 保存或修改备忘录信息 private void saveOrUpdate() { ContentValues values = new ContentValues(); values.clear(); values.put(Tasks.CONTENT, contentDesc.getText().toString()); values.put(Tasks.DATE1, dateDesc.getText().toString()); values.put(Tasks.TIME1, timeDesc.getText().toString()); values.put(Tasks.ON_OFF, ctv1.isChecked() ? 1 : 0); values.put(Tasks.ALARM, ctv2.isChecked() ? 1 : 0); // 修改 if (id1 != 0) { Uri uri = ContentUris.withAppendedId(Tasks.CONTENT_URI, id1); getContentResolver().update(uri, values, null, null); // 保存 } else { Uri uri = TaskList.Tasks.CONTENT_URI; getContentResolver().insert(uri, values); } } } 3. TaskList.java package com.amaker.ch17.app; import .Uri; import android.provider.BaseColumns; /** * @author 冯春礼 * 备忘录常量类 */ public final class TaskList { // 授权常量 public static final String AUTHORITY = "com.amaker.provider.TaskList"; private TaskList() {} // 内部类 public static final class Tasks implements BaseColumns { private Tasks() {} // 访问Uri public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/taskLists"); public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.amaker.tasklist"; public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.amaker.tasklist"; // 默认排序常量 public static final String DEFAULT_SORT_ORDER = "created DESC"; // 表字段常量 public static final String CONTENT = "content"; public static final String CREATED= "created"; public static final String DATE1 = "date1"; public static final String TIME1 = "time1"; public static final String ON_OFF = "on_off"; public static final String ALARM = "alarm"; } } 4. TaskListActivity.java package com.amaker.ch17.app; import android.app.ListActivity; import android.content.ContentUris; import android.content.Intent; import android.database.Cursor; import .Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.AdapterView.OnItemClickListener; import com.amaker.ch17.app.TaskList.Tasks; /** * * @author 冯春礼 * 备忘录列表类,提供数据展示 */ public class TaskListActivity extends ListActivity { // 菜单项常量 private static final int NEW = 1; private static final int DEL = 2; // 查询列数组 private static final String[] PROJECTION = new String[] { Tasks._ID, // 0 Tasks.CONTENT, // 1 Tasks.CREATED, // 2 Tasks.ALARM, //
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服