Android SQLite,使用广播类和服务类的报警管理器

Android SQLite,使用广播类和服务类的报警管理器,android,Android,我是android开发新手。我想从sqlite db设置一个警报,并在时间和日期上获取警报。我已经尽了最大努力使用extends BroadcastReceiver类和extends服务来查看它的工作情况,但我做不到。这是广播接收器的代码 public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {

我是android开发新手。我想从sqlite db设置一个警报,并在时间和日期上获取警报。我已经尽了最大努力使用extends BroadcastReceiver类和extends服务来查看它的工作情况,但我做不到。这是广播接收器的代码

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
           if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED)) {
        Intent serviceIntent = new Intent(context, MyService.class);
        context.startService(serviceIntent);
    }
   }
}

对于另一类,即服务类。这是密码

 @Override
public IBinder onBind(Intent intent) {
      return null;
}

@Override
public void onCreate() {
     super.onCreate();
    Calendar calender = Calendar.getInstance();
    calender.clear();
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    SimpleDateFormat formatt = new SimpleDateFormat("hh:mm");

    CharSequence text = format.format(new Date());
    ;
    CharSequence time = formatt.format(new Date());
    ;
    String sql = String.format("SELECT * FROM comments_table WHERE time = '" + String.valueOf(time) + "'" +
            "and date =  '%s'", String.valueOf(text) + "");
    Cursor c = db.rawQuery(sql, null);
    int count = c.getCount();
    String[] data_me = new String[count];
    for (int i = 0; i < count; i++) {
        c.moveToNext();
        data_me[i] = c.getString(0);

    }
    c.close();
    db.close();

    AlarmManager[] alarmManager = new AlarmManager[24];
    for (int ii = 0; ii < data_me.length; ii++) {


        alarmManager[ii] = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent i = new Intent(getBaseContext(), MyReceiver.class);

        PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), ii, i, 0);
        alarmManager[ii].set(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), displayIntent);


    }
}
@覆盖
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
日历日历=Calendar.getInstance();
压延机;
SimpleDataFormat格式=新的SimpleDataFormat(“dd/MM/yyyy”);
SimpleDataFormat Format=新的SimpleDataFormat(“hh:mm”);
CharSequence text=format.format(新日期());
;
CharSequence time=format.format(新日期());
;
String sql=String.format(“从注释表中选择*,其中时间=”+“String.valueOf(time)+”+
日期='%s',String.valueOf(text)+';
游标c=db.rawQuery(sql,null);
int count=c.getCount();
字符串[]数据_me=新字符串[计数];
for(int i=0;i
}


请问,有人能帮我吗

这是一个好的开始。根据您发布的内容,只有在广播接收器启动后,您的服务才会恢复。在这种情况下,在设备启动后。在Android 6(棉花糖)之前,这足以处理重启后的操作。这种意图通常不足以处理重新启动。 你使用的是运行安卓6的设备吗?如果是,您可以在运行Android 5或更低版本的开发环境中创建一个模拟设备,以查看您的代码是否适用于运行Android 5或更低版本的设备。假设你想支持运行安卓6或更高版本的设备,你必须选择一个不同的目的来处理你的接收器

要处理AlarmManager,请执行以下操作: 很抱歉Alarmmanager的set方法使用从数据库检索日期和时间之前创建的日历对象。因此,当您使用它设置AlarmManager时,它将关闭,而不是从数据选项卡中保存日期和时间。您可以创建一个日历数组或数组列表来存储检索到的日期,然后循环使用它来设置AlarmManager

另外,为了防止sqlite注入,使用query方法代替rawQuery更安全

编辑让我们浏览一下您的代码:

 @Override
public IBinder onBind(Intent intent) {
      return null;
}

@Override
public void onCreate() {
     super.onCreate();
     Calendar calender = Calendar.getInstance();
     calender.clear(); //WHY CLEAR CALENDAR? LATER YOU USE IT TO SET THE ALARMMANAGER.
     SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
     SimpleDateFormat formatt = new SimpleDateFormat("hh:mm");

    CharSequence text = format.format(new Date());
    ; //REMOVE SEMI-COLON
    CharSequence time = formatt.format(new Date());
    ; //REMOVE SEMI-COLON
    String sql = String.format("SELECT * FROM comments_table WHERE time = '" + String.valueOf(time) + "'" + "and date =  '%s'", String.valueOf(text) + ""); 
    /*WHAT ARE YOU SELECTING FROM THE DB? 
    *YOU ARE ALREADY USING THE CURRENT TIME AS A PARAMETER; ASSUMEDLY, 
    *YOU'RE NOT RETRIEVING THE DATE AND TIME*/

    Cursor c = db.rawQuery(sql, null); //WHERE IS YOUR db INITIALIZED & OPENED? ADD APPROPRIATE CODE **BEFORE** MAKING THIS QUERY
    int count = c.getCount();
    String[] data_me = new String[count];
    for (int i = 0; i < count; i++) {
        c.moveToNext();
        data_me[i] = c.getString(0);

    }
    c.close();
    db.close();

    AlarmManager[] alarmManager = new AlarmManager[24];
    for (int ii = 0; ii < data_me.length; ii++) {


        alarmManager[ii] = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent i = new Intent(getBaseContext(), MyReceiver.class);

         PendingIntent displayIntent = PendingIntent.getBroadcast(getBaseContext(), ii, i, 0);
         alarmManager[ii].set(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), displayIntent);

        }
    }
}
@覆盖
公共IBinder onBind(意向){
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
日历日历=Calendar.getInstance();
CALENDAR.clear();//为什么要清除日历?稍后您可以使用它来设置ALARMMANAGER。
SimpleDataFormat格式=新的SimpleDataFormat(“dd/MM/yyyy”);
SimpleDataFormat Format=新的SimpleDataFormat(“hh:mm”);
CharSequence text=format.format(新日期());
;//删除分号
CharSequence time=format.format(新日期());
;//删除分号
String sql=String.format(“从注释表中选择*,其中时间=”+“String.valueOf(time)+“+”,日期=“%s”,String.valueOf(text)+”);
/*您从数据库中选择了什么?
*您已经在使用当前时间作为参数;假设,
*您没有检索日期和时间*/
游标c=db.rawQuery(sql,null);//数据库在哪里初始化和打开?在**进行此查询之前,添加适当的代码**
int count=c.getCount();
字符串[]数据_me=新字符串[计数];
for(int i=0;i
是否有其他启动服务的方式,具体来说,是否希望用户设置服务运行的时间和/或日期(例如,使用时间选择器)?在这种情况下,您将让一个BroadcastReceiver接收到意图,然后调用服务,就像您现在在重新启动后所做的那样。事实上,您可以向当前的Receiver类添加一个意图来处理这样的意图;请记住检查清单文件中是否有任何适用的意图过滤器


如果您从查询中检索日期/时间,并希望使用它们来设置AlarmManager,您可能希望将日期/时间存储在日历对象中,并将其放置在日历阵列列表中,在设置AlarmManager时,您将在其中循环。

谢谢您的帮助。非常感谢您的帮助。但你说的这些都是我做的,但都没用这就是为什么我说你能帮我接通吗。我只选择了一列,其中日期等于当前日期,时间等于当前时间。我做了很多想看到我做了这个多重警报的工作,但我不能。请请请所有我需要从你是活的代码,以便我测试运行。谢谢