我要做一个提醒类的应用,现在创建了一个服务WarnService
我怎么在这个服务里面实现:
查找数据库中所有设置的提醒时间,然后通过匹配手机当前时间发出铃声,震动,或者通知栏提醒呢?

解决方案 »

  1.   

    注册一个开机广播,在开机广播中开打服务,然后查询数据库,进行时间的比对,并做相应的处理,楼主的逻辑很清楚啊,按照这个做下去就行了参考代码: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;
    }
    }