我是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);
}
}
}
是的,有人可以帮助我吗?答案 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。