用药提醒程序设计(原创)(定时、定时3次、按用户定时,前半小时2分钟提醒一次,后一个半小时10分钟提醒一次)

思路大致是这样的:

1.用户手动输入(模拟服务器发来的消息),将用药提醒时间存入SQLITE数据库,同时,每隔2分钟的间隔录入一个时间点,持续录入15个(即30分钟),每隔10分钟的间隔录入一个时间点,持续录入9个(即90分钟),共计2小时,24个标记位状态都列为0;

2.如果到了时间点,响起闹铃,用户取消,所有的标志位都重新置为1;

3.如果到了SQLITE录入时间点3小时以后的时间,所有的标志位重新置为0;

4.监听进程一直获取当前的时间,如果当前的时间到了数据库记录的时间点,并且标志位是0,则会响起闹铃。

将来的扩展:

1.数据库要增加用户字段,因为一个报警设备有多个用户,并且每个用户最多可以设置三个时间点,入库过程之中是这样的存储结构。

   id     time    user

   0     13:43   zzk

   1     13;45   tom

   2    20:00   tom

   3     21:00  tom

2.时间点存储如下所示,根据不同的用户,分别新建不一样的文件:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="10:01">1</string>
<string name="10:03">1</string>
<string name="10:23">1</string>
<string name="09:53">1</string>
<string name="09:51">1</string>
<string name="10:13">1</string>
<string name="09:41">1</string>
<string name="11:13">1</string>
<string name="11:23">1</string>
<string name="11:33">1</string>
<string name="10:53">1</string>
<string name="11:03">1</string>
<string name="10:33">1</string>
<string name="10:43">1</string>
<string name="09:39">1</string>
<string name="09:37">1</string>
<string name="09:35">1</string>
<string name="09:33">1</string>
<string name="09:43">1</string>
<string name="09:57">1</string>
<string name="09:45">1</string>
<string name="09:55">1</string>
<string name="09:47">1</string>
<string name="09:49">1</string>
<string name="09:59">1</string>
</map>

3.以下贴代码:

DB工具包:

package com.zzk.util;

/* import相关class */
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DailyBgDB extends SQLiteOpenHelper
{
  /* 变量声明 */
  private final static String DATABASE_NAME = "dailyBG_db";
  private final static int DATABASE_VERSION = 1;
  private final static String TABLE_NAME = "dailySetting_table";
  public final static String FIELD1 = "DailyId";
  public final static String FIELD2 = "DailyTm";
  public SQLiteDatabase sdb;

  /* 构造符 */
  public DailyBgDB(Context context)
  {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    sdb= this.getWritableDatabase();
  }

  @Override
  public void onCreate(SQLiteDatabase db)
  {
    /* Table不存在就创建table */
    String sql = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+"("+FIELD1
        +" INTEGER primary key, "+FIELD2+" TEXT)";
    db.execSQL(sql);

    /* 初始的资料到DB */
    sdb=db;
//    insert(0,99);
//    insert(1,99);
//    insert(2,99);
//    insert(3,99);
//    insert(4,99);
//    insert(5,99);
//    insert(6,99);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  {
  }

  public Cursor select()
  {
    Cursor cursor=sdb.query(TABLE_NAME,null,null,null,null,null,null);
    return cursor;
  }
  /* select时有where条件要用否method */
  public Cursor select(String selection,String[] selectionArgs)
  {
    String[] columns = new String[] { FIELD2 };
    Cursor cursor=sdb.query(TABLE_NAME,columns,selection,selectionArgs,
                            null,null,null);
    return cursor;
  } 

  public long insert(int value1,String value2)
  {
    /* 将新增的值放入ContentValues */
    ContentValues cv = new ContentValues();
    cv.put(FIELD1, value1);
    cv.put(FIELD2, value2);
    long row = sdb.insert(TABLE_NAME, null, cv);
    return row;
  }

  public void delete(int id)
  {
    String where = FIELD1 + " = ?";
    String[] whereValue ={ Integer.toString(id) };
    sdb.delete(TABLE_NAME, where, whereValue);
  }

  public void update(int id, int value)
  {
    String where = FIELD1 + " = ?";
    String[] whereValue ={ Integer.toString(id) };
    /* 将修改的值放入ContentValues */
    ContentValues cv = new ContentValues();
    cv.put(FIELD2, value);
    sdb.update(TABLE_NAME, cv, where, whereValue);
  }

}

页面:

package net.blogjava.mobile;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.zzk.util.DailyBgDB;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;

public class Main extends Activity implements OnClickListener {
	private TextView tvAlarmRecord;
	private SharedPreferences sharedPreferences;
	private SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
	private DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
	private DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");
	private AlarmManager alarmManager;
	private PendingIntent pendingIntent;
	public String setTime;

	  /* 声明定义的数据库变量DailyBgDB */
	private DailyBgDB db;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Button btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm);
		tvAlarmRecord = (TextView) findViewById(R.id.tvAlarmRecord);

		btnAddAlarm.setOnClickListener(this);
		sharedPreferences = getSharedPreferences("alarm_record",
				Activity.MODE_PRIVATE);

		alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
		Intent intent = new Intent(this, AlarmReceiver.class);
		// 创建封装BroadcastReceiver 的pendingIntent对象
		pendingIntent = PendingIntent.getBroadcast(this, 0,
				intent, 0);
		// 开始定时器,每1分钟执行一次,5s
		alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 0, 10000,
				pendingIntent);
		// alarmManager.cancel(pendingIntent);
		Button cancel = (Button) findViewById(R.id.button1);
		cancel.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Log.e("setTime", "" + setTime);
				updateAlarm(setTime,1);
			}
		});
	}

	@Override
	public void onClick(View v) {
		View view = getLayoutInflater().inflate(R.layout.alarm, null);

		final TimePicker timePicker = (TimePicker) view
				.findViewById(R.id.timepicker);
		timePicker.setIs24HourView(true);

		// 显示设置时间点的对话框
		new AlertDialog.Builder(this).setTitle("设置提醒时间").setView(view)
				.setPositiveButton("确定", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						String timeStr = String.valueOf(timePicker
								.getCurrentHour())
								+ ":"
								+ String.valueOf(timePicker.getCurrentMinute());
						// 将时间点添加到 TextView 组件中
						tvAlarmRecord.setText(tvAlarmRecord.getText()
								.toString() + "\n" + timeStr);
						// count++;

						/*
						 * View view2 = new View(Main.this);
						 * view2.setLayoutParams(new
						 * LayoutParams(LayoutParams.FILL_PARENT,1));
						 * view2.setBackgroundColor(Color.RED); LinearLayout
						 * linearLayout =
						 * (LinearLayout)getLayoutInflater().inflate
						 * (R.layout.main, null); linearLayout.addView(view2);
						 */
						Log.e("hour", "" + timePicker.getCurrentHour());
						Log.e("minute", "" + timePicker.getCurrentMinute());
						Log.e("time point:", "--------" + timeStr);
						setTime = timeStr;
						setAlarm(timeStr);
						//将定时信息入数据库
						//saveData(1,setTime);
						saveData(1,setTime);
					}
				}).setNegativeButton("取消", null).show();
	}

	//timeStr是时间(小时+分钟)
	public void setAlarm(String timeStr) {
		Date date = null;
		String str = null;
		Calendar cal = Calendar.getInstance();
		Date dateNow = cal.getTime();
		str = format2.format(dateNow) + " " + timeStr;
		try {
			date = format1.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long t = date.getTime();
		System.out.println(t);

		for (int i = 0; i <= 14; i++) {
			Date now3 = new Date(t + 1000 * 60 * 2 * i); // 每两分钟输出一次
			String time3 = formatter.format(now3);
			System.out.println("十分钟后的时间是:" + time3);
			// 保存时间点
			sharedPreferences.edit().putString(time3, 0+"")
					.commit();

		}

		System.out.println("---------------30分钟以后的时间是---------");

		for (int i = 0; i <= 9; i++) {
			Date now4 = new Date(t + 1000 * 60 * 2 * 15 + 1000
					* 60 * 10 * i);

			String time4 = formatter.format(now4);
			System.out.println("十分钟后的时间是:" + time4);
			// 保存时间点
			sharedPreferences.edit().putString(time4, 0+"")
					.commit();
		}
	}

	//timeStr是时间(小时+分钟)
	public void updateAlarm(String timeStr,int type) {
		Date date = null;
		String str = null;
		Calendar cal = Calendar.getInstance();
		Date dateNow = cal.getTime();
		str = format2.format(dateNow) + " " + timeStr;
		try {
			date = format1.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long t = date.getTime();
		System.out.println(t);

		for (int i = 0; i <= 14; i++) {
			Date now3 = new Date(t + 1000 * 60 * 2 * i); // 每两分钟输出一次
			String time3 = formatter.format(now3);
			System.out.println("十分钟后的时间是:" + time3);
			// 保存时间点
			sharedPreferences.edit().putString(time3, type+"")
					.commit();

		}

		System.out
				.println("---------------30分钟以后的时间是---------");

		for (int i = 0; i <= 9; i++) {
			Date now4 = new Date(t + 1000 * 60 * 2 * 15 + 1000
					* 60 * 10 * i);

			String time4 = formatter.format(now4);
			System.out.println("十分钟后的时间是:" + time4);
			// 保存时间点
			sharedPreferences.edit().putString(time4, type+"")
					.commit();
		}
	}

	  /* 储存设定值吹DB的method */
	  private void saveData(int id,String value){
	    db=new DailyBgDB(Main.this);
	    db.insert(id,value);
	    db.close();
	  }
}

监听程序:

package net.blogjava.mobile;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import com.zzk.util.DailyBgDB;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.media.MediaPlayer;
import android.util.Log;

public class AlarmReceiver extends BroadcastReceiver
{
	private static int num = 0;  

	  /* 声明定义的数据库变量DailyBgDB */
	private DailyBgDB db;
	private SharedPreferences sharedPreferences;
	private SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
	private DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
	private DateFormat format2 = new SimpleDateFormat("yyyy-MM-dd");

	@Override
	public void onReceive(Context context, Intent intent)
	{
	    sharedPreferences = context.getSharedPreferences(
				"alarm_record", Activity.MODE_PRIVATE);
		String hour = String.valueOf(Calendar.getInstance().get(
				Calendar.HOUR_OF_DAY));
		String minute = String.valueOf(Calendar.getInstance().get(
				Calendar.MINUTE));
		if(minute.length()==1){
			minute="0"+minute;
		}

		/***
		 * 监控程序
		 * 第一步、获取数据库中的时间
		 * 第二步,将数据库中的时间换算成两小时以后的时间
		 * 第三步,如果当前时间到了两小时以后的时间,更新XML
		 */
		/* 储存设定值吹DB的method */
		db=new DailyBgDB(context);

		//获取数据库中的时间
		Cursor cur=db.select("DailyId=1", null);
		while(cur.moveToNext()) {
			cur.getInt(0);
			//Log.e("----1-------", cur.getString(cur.getColumnIndex("DailyId")));
			Log.e("----2-------", cur.getString(0));
			if(get2HourLaterTime(cur.getString(0)).equalsIgnoreCase(hour + ":" + minute)) {
				updateAlarm(cur.getString(0), 0);
			}
			cur.close();
		}

		Log.e("ActionBroadCast", "New Message !" + num++);
		// 从XML 文件夹获得描述当前时间点的value
		String time = sharedPreferences.getString(hour + ":" + minute, null);
		if (time != null) {
			if(time.equalsIgnoreCase("0")) {
				Log.e("value", time);
				// 播放声音
				MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.ring);
				mediaPlayer.start();
			}

		}

		db.close();

	}

	//timeStr是时间(小时+分钟)
	public void updateAlarm(String timeStr,int type) {
		Date date = null;
		String str = null;
		Calendar cal = Calendar.getInstance();
		Date dateNow = cal.getTime();
		str = format2.format(dateNow) + " " + timeStr;
		try {
			date = format1.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long t = date.getTime();
		System.out.println(t);

		for (int i = 0; i <= 14; i++) {
			Date now3 = new Date(t + 1000 * 60 * 2 * i); // 每两分钟输出一次
			String time3 = formatter.format(now3);
			System.out.println("十分钟后的时间是:" + time3);
			// 保存时间点
			sharedPreferences.edit().putString(time3, type+"")
					.commit();

		}

		System.out
				.println("---------------30分钟以后的时间是---------");

		for (int i = 0; i <= 9; i++) {
			Date now4 = new Date(t + 1000 * 60 * 2 * 15 + 1000
					* 60 * 10 * i);

			String time4 = formatter.format(now4);
			System.out.println("十分钟后的时间是:" + time4);
			// 保存时间点
			sharedPreferences.edit().putString(time4, type+"")
					.commit();
		}
	}

	public String get2HourLaterTime(String timeStr) {
		Date date = null;
		String str = null;
		Calendar cal = Calendar.getInstance();
		Date dateNow = cal.getTime();
		str = format2.format(dateNow) + " " + timeStr;
		try {
			date = format1.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		long t = date.getTime();
		System.out.println(t);

		Date now3 = new Date(t + 1000 * 60 * 60 * 3);
		//Date now3 = new Date(t + 1000 * 60 *  2);
		return formatter.format(now3);
	}

}

源代码地址是:

http://download.csdn.net/detail/opzoonzhuzhengke/5817857

时间: 2024-11-03 04:23:57

用药提醒程序设计(原创)(定时、定时3次、按用户定时,前半小时2分钟提醒一次,后一个半小时10分钟提醒一次)的相关文章

求spring 定时器 每天上午8点到晚上12点每10分钟运行一次定时规则

问题描述 求spring 定时器 每天上午8点到晚上12点每10分钟运行一次定时规则<property name="cronExpression" value="0 0/10 8-23 * * ?" />我是这样写的,无效ing求高手指正....谢谢 解决方案 贴下其他配置看看呢,单看<property name="cronExpression" value="0 0/10 8-23 * * ?" />

新浪微博定时删怎么用?微博定时删是什么功能?

1)我们打开最新版本的新浪微博之后我们再点击[+]进入,细节如下图所示    2)接着我们再打开里面的[更多]找到[定时删]点击进入,如下图所示.     3)现在就会打开发微博页面,不过比平时多了一个#10分钟删#(时间可改成其他,比如#1分钟删#),然后我们点击发送,那么到我们发送之后的#X分钟之时就会给删除了.   友情提示 新浪微博还是很强大的支持的手机平台iphone,安卓,wp系统哦   

qq音乐定时播放功能怎么用,qq音乐定时播放位置

在手机中我们打开并登陆QQ音乐的主页面 进入到更多界面中我们点击"设置"按钮,如下图所示. 然后在打开界面中会看到有一项定时关闭,打开定时关闭的按钮,默认是10分钟,我们也可以自行设置更长或更短的时间. 我们可以修改其他时间 点击关闭,我们也可以快速的关闭定时关闭歌曲播放 好了这样关于qq音乐定时播放功能的一个简单的使用操作方法也就介绍完了,其实相当的简单.

Winform开发框架之通用定时服务管理2---如何开发定时服务应用

在上篇随笔<Winform开发框架之通用定时服务管理>介绍了我的框架体系中,通用定时服务管理模块的设计以及一些相关功能的展示.我们在做项目的时候,或多或少需要和其他外部系统或者接口进行数据交互,有些是单向的获取,有些是双向的操作.这个定时操作(可能是间隔的时间,也可以能是定在某一个时刻,也可以能是让它在某天某时刻运行),那么这就需要定时服务程序来管理了,通常我们把他寄宿在Windows服务里面(这也是一种最佳的方式),这种方式最好的地方,就是它的生命周期可以随着电脑的启动而启动,而且很少需要用

iOS日历中给一个事件添加多个提醒

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS自带的日历应用中,我们最多只能给一个事件设置2个提醒,但是通过代码,我们可以给事件设置任意多个提醒. 给事件设置提醒的代码可以看我写的这篇文章: iOS9中如何在日历App中创建一个任意时间之前开始的提醒(三) 设置多个提醒的方法与此类似,我们只要创建多个提醒,再添加它们到事件中就可以了: EKAlarm *alarm = [EKAlarm alarmW

java 日历中用户创建一个跨天的事件提醒,那么我的java日历应当如何去记录并打印出这样的事件呢?

问题描述 java 日历中用户创建一个跨天的事件提醒,那么我的java日历应当如何去记录并打印出这样的事件呢? 一个班级假如有100个同学,现在我们按照学号随机选择连续学号的42名同学,这42名同学一排7人分为6排,然后按照他们这一年来参加活动的多少来给分,规定一个同学参加一次班级活动就给这位同学1分,参加一次团体表演(你可以认为参加团体表演的人都是按照学号顺序相邻的,比如从1到10号的同学,他们一块进行了一场团体表演,学号15-30的16位同学一块进行了一次团体表演等,这些人每人都能获得1分)

还在担心公共WiFi不安全?iOS 10可以提醒你

iOS 10 除了带来一系列新功能之外,它在安全方面的提升也是用户不可忽略的. 近日国外有网友就在 WiFi 的设置页面中发现了 iOS 10 的另一个新特性:当用户连接到一个公共 WiFi 时系统会对用户发出警告提醒.当你加入一个有潜在危险的公共网络时,iOS 会在 WiFi 的详情页的顶部显示一则警告:开放的网络安全性无法保证且所有网络通讯或遭揭露. 还在担心公共WiFi不安全?iOS 10可以提醒你 至于私人 WiFi,iOS(系统)会进一步建议用户为特定网络将路由器配置改为 WPA2 P

定时同步数据求教-java接口定时同步数据有好的解决方案吗?数据量可能上万或上十万条,求高手赐教

问题描述 java接口定时同步数据有好的解决方案吗?数据量可能上万或上十万条,求高手赐教 我调别人的接口,要每天一次定时把对面的数据同步到我们的(oracle)数据库里,之前没做过类似的,现在想法是每条数据都先查询一下,存在就跟新,不存在就插入..但是感觉这样数据库压力大吗,请问有别的好的想法吗?大神快来..还没有C币,谢谢了 解决方案 这么大量的数据,建议你打包成文件然后下载. 解决方案二: oracle不是有merge吗?不用先查询的 解决方案三: 1.先把数据全部取过来放到一张临时表中 2

红米Note定时开关机怎么设置?定时开关机设置图解

一)红米Note设置定时开机 1)在红米Note手机中我们点击"闹钟"然后我们在打开界面点击"三横"进入.    2)接着我们再点击"设置"再找到"关机闹钟"如果需要闹钟就设定一下铃声和振动;不需要闹钟,是要开机的话,铃声为无声,关闭振动,然后点击右上角的确定即可完成.    二)设置定时关机 1)定时关机这个手机自身是不支持的我们需要一个root权限(推荐阅读:一键root权限获取方法 )有了root权限我们再在手机上安装一