用藥提醒程序設計(原創)(定時、定時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>
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); } }
源代碼地址是:
https://download.csdn.net/detail/opzoonzhuzhengke/5817857
最後更新:2017-04-03 16:48:43