我要做一个提醒类的应用,现在创建了一个服务WarnService
我怎么在这个服务里面实现:
查找数据库中所有设置的提醒时间,然后通过匹配手机当前时间发出铃声,震动,或者通知栏提醒呢?
------解决方案--------------------
注册一个开机广播,在开机广播中开打服务,然后查询数据库,进行时间的比对,并做相应的处理,楼主的逻辑很清楚啊,按照这个做下去就行了
参考代码:
- Java code
package stock.app.calendar.service;import java.util.ArrayList;import java.util.Calendar;import java.util.HashMap;import java.util.List;import java.util.Map;import stock.app.calendar.Alert;import stock.app.calendar.R;import stock.app.calendar.provider.ProviderData;import android.app.Service;import android.content.Intent;import android.database.ContentObserver;import android.database.Cursor;import android.media.AudioManager;import android.media.SoundPool;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;public class CalendarService extends Service { /** * list集合 */ List<Map<String,String>> list = new ArrayList<Map<String,String>>(); private int iListSize; private String sRemindDate,sRemindTime,sTime; private String sCurrentDate,sCurrentTime; private String sNewDate,sNewTime; private String sTitle; private Handler handler = new Handler(); private CalendarContent content; /** * 播放提示声音 */ private SoundPool sound; /** * 声音 */ private int song; public IBinder onBind(Intent arg0) { return null; } public void onDestroy() { super.onDestroy(); } public void onStart(Intent intent, int startId) { getCurrentTime(); list(); content = new CalendarContent(new Handler()); /** * 注册数据库变化监听 */ this.getContentResolver().registerContentObserver(Uri.parse("content://" + ProviderData.AUTHENTICATE + "/" + ProviderData.TB_CALENDAR), true, content); handler.postDelayed(task, 1000); sound = new SoundPool(10,AudioManager.STREAM_SYSTEM,5); song = sound.load(CalendarService.this, R.raw.ringer,0); super.onStart(intent, startId); } private Runnable task= new Runnable(){ public void run() { try { handler.postDelayed(task,1000); getCurrentTime(); iListSize = list.size(); /** * 格式化当前日期、时间 */ final String currentTime = sCurrentDate + " " + sCurrentTime; if(iListSize > 0){ for(int i = 0;i < iListSize;i ++){ /** * 遍历for循环,如果当前日期、时间和设定的时间相等,就处理事件 */ sRemindDate = list.get(i).get("new_date"); sRemindTime = list.get(i).get("new_time"); sTime = sRemindDate + " " + sRemindTime + ":00"; if(currentTime.equals(sTime)){ /** * 开启一个服务,在服务中阻止键盘锁 */ final Intent mService = new Intent(CalendarService.this,ScreenService.class); mService.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startService(mService); /** * 跳转到对话框页面 */ final Intent intent = new Intent(CalendarService.this,Alert.class); final Bundle bundle = new Bundle(); bundle.putString("time", list.get(i).get("new_date") + " " + list.get(i).get("new_time")); bundle.putString("title", list.get(i).get("title")); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtras(bundle); CalendarService.this.startActivity(intent); Thread.sleep(1000); stopService(mService); content.onChange(true); sound.play(song, 1, 1, 0, 0, 1); } } } } catch (Exception e) { e.printStackTrace(); } } }; class CalendarContent extends ContentObserver{ public CalendarContent(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); list(); } } public void list(){ try { list.clear(); /** * 查询tb_info表的大于当前时间的备忘数据 */ Cursor cursor = getContentResolver().query(Uri.parse("content://" + ProviderData.AUTHENTICATE + "/" + ProviderData.TB_CALENDAR), null, "type=? and (new_date>? or (new_date=? and new_time>?))", new String[]{getString(R.string.beiwang),sCurrentDate,sCurrentDate,sCurrentTime.substring(0, sCurrentTime.lastIndexOf(":"))}, null); /** * 如果数据大于0,就将游标放在首位,开始遍历 */ if(cursor.getCount() > 0){ cursor.moveToFirst(); /** * 循环遍历,将所有的数据存放在list中 */ do{ sNewDate = cursor.getString(cursor.getColumnIndex(ProviderData.NEW_DATE)); sNewTime = cursor.getString(cursor.getColumnIndex(ProviderData.NEW_TIME)); sTitle = cursor.getString(cursor.getColumnIndex(ProviderData.TITLE)); Map<String,String> map = new HashMap<String,String>(); map.put(ProviderData.NEW_DATE, sNewDate); map.put(ProviderData.NEW_TIME, sNewTime); map.put(ProviderData.TITLE, sTitle); list.add(map); }while(cursor.moveToNext()); } cursor.close(); } catch (Exception e) { e.printStackTrace(); } } public void getCurrentTime(){ /** * 获取当前日期、时间 */ final Calendar c = Calendar.getInstance(); final int iYear = c.get(Calendar.YEAR); final int iMonth = c.get(Calendar.MONTH) + 1; final int iayD = c.get(Calendar.DATE); final int iHour = c.get(Calendar.HOUR_OF_DAY); final int iMinute = c.get(Calendar.MINUTE); final int iSecond = c.get(Calendar.SECOND); sCurrentDate = iYear + "-" + format(iMonth) + "-" + format(iayD); sCurrentTime = format(iHour) + ":" + format(iMinute) + ":" + format(iSecond); } /** * 格式化时间 * @param x * @return */ private String format(int x) { String s = "" + x; if (s.length() == 1) { s = "0" + s; } return s; }}