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

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

课程设计报告

(本科)

课程:

嵌入式系统

学号:

姓名:

班级:

教师:

时间:

2013年5月3日至6月20日

计算机科学与技术系

结果与分析(可以加页):

1.列表展示

主要功能把备忘录界面展示给用户,用户可以添加和删除备忘录信息,

2.备忘录维护

用户可以很好的将需要或者不需要的备忘录信息进行增添或者删除

运行结果:

3.备忘录定时提醒

这个功能可以很有效的提醒用户关闭备忘录,以免造成不必要的资源浪费。运行结果:

附录:源程序代码

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 https://www.360docs.net/doc/408270314.html,.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(https://www.360docs.net/doc/408270314.html,yout.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 https://www.360docs.net/doc/408270314.html,.Uri;

import android.os.Bundle;

import https://www.360docs.net/doc/408270314.html,youtInflater;

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(https://www.360docs.net/doc/408270314.html,yout.item_row, null);

switch (position) {

// 是否开启该条备忘录

case 0:

ctv1 = (CheckedTextView) li

.inflate(

https://www.360docs.net/doc/408270314.html,yout.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(https://www.360docs.net/doc/408270314.html,);

dateDesc = (TextView) v.findViewById(R.id.desc);

dateName.setText(strs[position]);

dateDesc.setText(mYear + "/" + mMonth + "/" + mDay);

return v;

// 提醒时间

case 2:

timeName = (TextView) v.findViewById(https://www.360docs.net/doc/408270314.html,);

timeDesc = (TextView) v.findViewById(R.id.desc);

timeName.setText(strs[position]);

timeDesc.setText(mHour + ":" + mMinute);

return v;

// 提醒内容

case 3:

contentName = (TextView) v.findViewById(https://www.360docs.net/doc/408270314.html,);

contentDesc = (TextView) v.findViewById(R.id.desc);

contentName.setText(strs[position]);

contentDesc.setText(content);

return v;

// 是否声音提示

case 4:

ctv2 = (CheckedTextView) li

.inflate(

https://www.360docs.net/doc/408270314.html,yout.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(https://www.360docs.net/doc/408270314.html,yout.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() {

ContentV alues values = new ContentV alues();

values.clear();

values.put(Tasks.CONTENT, contentDesc.getText().toString());

values.put(Tasks.DA TE1, 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 https://www.360docs.net/doc/408270314.html,.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 DA TE1 = "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 https://www.360docs.net/doc/408270314.html,.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, // 3

Tasks.DA TE1, // 4

Tasks.TIME1, // 5

Tasks.ON_OFF // 6

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 获得Intent

final Intent intent = getIntent();

// 设置Uri

if (intent.getData() == null) {

intent.setData(Tasks.CONTENT_URI);

}

// 获得ListView

ListView listView = getListView();

// 查询所有备忘录信息

Cursor cursor = managedQuery(getIntent().getData(), PROJECTION, null, null, Tasks.DEFAULT_SORT_ORDER);

// 创建Adapter

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,

https://www.360docs.net/doc/408270314.html,yout.simple_list_item_2, cursor,

new String[] {Tasks._ID, Tasks.CONTENT },

new int[] { android.R.id.text1,android.R.id.text2 });

// 将备忘录信息显示到ListView

setListAdapter(adapter);

// 为ListView添加单击事件监听器

listView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView av, View v, int position,

long id) {

// 通过ID查询备忘录信息

Uri uri = ContentUris.withAppendedId(Tasks.CONTENT_URI, id);

Cursor cursor = managedQuery(uri, PROJECTION, null,

null, Tasks.DEFAULT_SORT_ORDER);

if(cursor.moveToNext()){

int id1 = cursor.getInt(0);

String content = cursor.getString(1);

String created = cursor.getString(2);

int alarm = cursor.getInt(3);

String date1 = cursor.getString(4);

String time1 = cursor.getString(5);

int on_off = cursor.getInt(6);

Bundle b = new Bundle();

b.putInt("id", id1);

b.putString("content", content);

b.putString("created", created);

b.putInt("alarm", alarm);

b.putString("date1", date1);

b.putString("time1", time1);

b.putInt("on_off", on_off);

// 将备忘录信息添加到Intent

intent.putExtra("b", b);

// 启动备忘录详细信息Activity

intent.setClass(TaskListActivity.this, TaskDetailActivity.class);

startActivity(intent);

}

}

});

}

// 创建选项菜单

public boolean onCreateOptionsMenu(Menu menu) {

menu.add(0, NEW, 0, "新建");

menu.add(0, DEL, 0, "删除");

return true;

}

// 现象菜单项单击方法

public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) {

case NEW:

// 启动备忘录详细信息Activity

Intent intent = new Intent();

intent.setClass(this, TaskDetailActivity.class);

startActivity(intent);

return true;

case DEL:

return true;

}

return false;

}

}

5. TaskListProvider.java

package com.amaker.ch17.app;

import java.util.HashMap;

import android.content.ContentProvider;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Context;

import android.content.UriMatcher;

import android.database.Cursor;

import android.database.SQLException;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

import android.database.sqlite.SQLiteQueryBuilder;

import https://www.360docs.net/doc/408270314.html,.Uri;

import android.text.TextUtils;

import com.amaker.ch17.app.TaskList.Tasks;

/**

* @author 冯春礼

* 提供数据维护方法

*/

public class TaskListProvider extends ContentProvider { // 数据库名称常量

private static final String DATABASE_NAME = "task_list.db";

// 数据库版本常量

相关主题
相关文档
最新文档