Я выполняю напоминания (уведомления) в моем приложении, которое до сих пор работало хорошо.
Это происходит из фрагмента.Он устанавливает AlarmManager и добавляет напоминание в базу данных SQLite:
public void SendNotification (Reminders reminder, Context context)
{
Random rand = new Random();
db.AddReminderToDB(reminder); //adds all reminder fields to SQLite database
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, NotificationCentre.class);
int id = rand.nextInt(100); //for testing
intent.putExtra("Title", reminder.getTitle());
intent.putExtra("Message", reminder.getMessage());
intent.putExtra("Channel", reminder.getChannel());
intent.putExtra("ID", id);
PendingIntent pI = PendingIntent.getBroadcast(context, id, intent, 0);
alarm.setExact(AlarmManager.RTC_WAKEUP, reminder.getTime(), pI);
}
. Оно отправляется получателю широковещательной рассылки:
public class NotificationCentre extends BroadcastReceiver
{
@Override
public void onReceive (Context context, Intent intent)
{
if("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
SendNotificationAfterReboot(context);
}
else
{
ActuallySendNotification(context,intent);
}
}
void ActuallySendNotification(Context context, Intent intent)
{
String action = intent.getAction();
Log.i("Receiver", "Broadcast received: " + action);
String Channel = intent.getExtras().getString("Channel");
String title = intent.getExtras().getString("Title");
String message = intent.getExtras().getString("Message");
int id = intent.getExtras().getInt("ID");
NotificationHelper nh = new NotificationHelper(context);
NotificationCompat.Builder nBuilder = nh.getChannel1Notification(title, message,Channel);
nh.getManager().notify(id, nBuilder.build());
}
Все это работает нормально.Даже если пользователь свернет / закроет приложение, уведомления все еще будут срабатывать во время, которое было установлено.
Препятствие, с которым я сталкиваюсь, заключается в том, что оно срабатывает, если телефон был перезагружен.Я прочитал здесь много вопросов и статей в Интернете об этом, и у меня осталось несколько вопросов.
Мне удалось заставить приемник вещания выполнять код при перезагрузке телефона, главным образом благодаря переполнению стека.
Мои вопросы:
Имеет ли вещательный приемник возможность чтения из базы данных при запуске при загрузке (учитывая, что само приложение не запущено)?
Предполагая, что это возможно, и после запроса к базе данных я получаю информацию об уведомлении, я полагаю, что мне нужно настроить новый AlarmManager и передать ему данные уведомления.Я делаю это в Broadcast Receiver или где-то еще?
До сих пор я пробовал это, которое я вызвал из BroadcastReceiver, если действие намерения BOOT_COMPLETED:
void SendNotificationAfterReboot(Context context)
{
DatabaseHelper db = new DatabaseHelper(context);
ArrayList<Reminders> remindersList = new ArrayList<>();
remindersList.addAll(db.REMINDERS_ALL_TO_LIST());
for (Reminders reminder: remindersList) {
Toast.makeText(context,"Got a reminder",Toast.LENGTH_SHORT).show();
}
}
... но тосты не появились.Также, похоже, сбой SystemUI.Я полагаю, что это связано с тем, что «КОНТЕКСТ» не является тем, чем я думаю после перезагрузки.
Любая помощь здесь будет высоко ценится.
Подводя итог, все, что мне нужноЯ знаю, как мне поступить с настройкой AlarmManager для каждого напоминания, полученного из SQliteDatabase, из BroadcastReceiver при перезагрузке.
Большое спасибо, Алекс