无论时间是否流逝,重新启动时只设置第一个警报(android)
我刚接触安卓系统,试图通过阅读一些书籍和教程来创建一个事件提醒应用程序。请原谅,如果这是重复的问题,但我在论坛上搜索,无法得到解决我的问题。当设备开启时,警报会被正确触发。但当我的设备在onreceive中重新启动时,它会读取数据库中的所有数据,并通过调用setRemembers()方法设置所有报警,然后无论时间是否已到,它都会触发第一个报警,并且不会显示任何其他报警的通知(尽管第二个和第三个报警必须显示)。我在舱单中添加了权限和接收人。这是我的密码 开机接收机无论时间是否流逝,重新启动时只设置第一个警报(android),android,Android,我刚接触安卓系统,试图通过阅读一些书籍和教程来创建一个事件提醒应用程序。请原谅,如果这是重复的问题,但我在论坛上搜索,无法得到解决我的问题。当设备开启时,警报会被正确触发。但当我的设备在onreceive中重新启动时,它会读取数据库中的所有数据,并通过调用setRemembers()方法设置所有报警,然后无论时间是否已到,它都会触发第一个报警,并且不会显示任何其他报警的通知(尽管第二个和第三个报警必须显示)。我在舱单中添加了权限和接收人。这是我的密码 开机接收机 public class
public class OnBootReceiver extends BroadcastReceiver
{
private static final String TAG = ComponentInfo.class.getCanonicalName();
@Override
public void onReceive(Context context, Intent intent)
{
ReminderManager reminderMgr = new ReminderManager(context);
RemindersDbAdapter dbHelper = new RemindersDbAdapter(context);
dbHelper.open();
Cursor cursor = dbHelper.fetchAllReminders();
if(cursor != null)
{
cursor.moveToFirst();
int rowIdColumnIndex = cursor.getColumnIndex(RemindersDbAdapter.KEY_ROWID);
int dateTimeColumnIndex = cursor.getColumnIndex(RemindersDbAdapter.KEY_DT);
while(cursor.isAfterLast() == false)
{
Log.d(TAG, "Adding alarm from boot.");
Log.d(TAG, "Row Id Column Index - " + rowIdColumnIndex);
Log.d(TAG, "Date Time Column Index - " + dateTimeColumnIndex);
Long rowId = cursor.getLong(rowIdColumnIndex);
Log.d(TAG, "rowid - " + rowId);
String dateTime = cursor.getString(dateTimeColumnIndex);
Calendar cal = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat(DisplayMessageActivity.DATE_TIME_FORMAT);
try {
java.util.Date date = format.parse(dateTime);
Log.d(TAG, "Date- " + date);
cal.setTime(date);
reminderMgr.setReminder(rowId, cal);
} catch (java.text.ParseException e) {
Log.e("OnBootReceiver", e.getMessage(), e);
}
cursor.moveToNext();
}
cursor.close() ;
}
dbHelper.close();
}
}
}
提醒管理器
public class ReminderManager
{
private static final String TAG = ComponentInfo.class.getCanonicalName();
private Context mContext;
private AlarmManager mAlarmManager;
public ReminderManager(Context context)
{
mContext = context;
mAlarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
}
public void setReminder(Long taskId, Calendar when)
{
Log.d(TAG, "when: "+when);
Log.d("remindermanage", "rowid: "+taskId);
Intent i = new Intent(mContext, OnAlarmReceiver.class);
i.putExtra(RemindersDbAdapter.KEY_ROWID, (long)taskId);
PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_ONE_SHOT);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi);
}
}
您的代码中存在多个问题: 1) 在广播接收机中使用数据库这不是一个好主意,最好启动一个意向服务并在那里完成工作
2) 您正在循环中调用setReminder,但您正在使用挂起的实例,因为您始终使用0和FLAG_ONE_shot。如果要创建多个挂起的意图,每次都需要创建一个唯一的id并传递给该方法。非常感谢!!我会努力找出你指出的!!我应该在intent service中创建另一个方法来设置报警,还是应该只向该方法传递唯一id。