SQLite,使用广播类和服务类的Alarm Manager

时间:2017-09-12 22:36:10

标签: android

我是Android开发的新手。我想从sqlite db设置一个警报并按时间和日期获取警报。我尽力使用扩展的BroadcastReceiver类并使用扩展服务但是我无法实现。这是BroadcastReceiver的代码

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);
    }
   }

}

和另一个类,即Service类。这是代码

 @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);


    }
}

}

是的,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

这是一个好的开始。根据您发布的内容,您的服务将仅在广播接收器启动后才会启动。在这种情况下,设备启动后。在Android 6(Marshmallow)之前,这足以在重启后处理操作。这种意图通常不足以处理重启。 您使用的是运行Android 6的设备吗?如果是,您可以在运行Android 5或更低版本的开发环境中创建模拟设备,以查看您的代码是否适用于运行此Android 5或更低版本的设备。假设您要支持运行Android 6或更高版本的设备,则必须选择接收方处理的其他意图。

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

顺便说一句,使用查询方法代替rawQuery以防止sqlite注入更安全。

编辑让我们来看看您的代码:

 @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);

        }
    }
}

您是否有不同的方式启动服务,具体而言,您是否希望让用户设置时间和/或日期(例如,使用TimePicker)来运行服务?在这种情况下,您将有一个BroadcastReceiver接收意图,然后调用服务,就像您重启后现在正在做的那样。实际上,您可以向当前的Receiver类添加一个intent来处理这样的intent;只需记住检查清单文件中是否包含任何适用的intent-filters。

如果从查询中检索日期/时间并想要使用它们来设置AlarmManager,您可能希望将日期/时间存储在Calendar对象中并将其放在Calendar ArrayList中,当您将循环播放时设置AlarmManager。

相关问题