资源描述
课程设计报告
(本科)
课程:
嵌入式系统
学号:
姓名:
班级:
教师:
时间:
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, //
展开阅读全文