Воссоздать уведомления из SQLiteDatabase при перезагрузке - PullRequest
0 голосов
/ 16 сентября 2018

Я выполняю напоминания (уведомления) в моем приложении, которое до сих пор работало хорошо.

Это происходит из фрагмента.Он устанавливает 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());
    }

Все это работает нормально.Даже если пользователь свернет / закроет приложение, уведомления все еще будут срабатывать во время, которое было установлено.

Препятствие, с которым я сталкиваюсь, заключается в том, что оно срабатывает, если телефон был перезагружен.Я прочитал здесь много вопросов и статей в Интернете об этом, и у меня осталось несколько вопросов.

Мне удалось заставить приемник вещания выполнять код при перезагрузке телефона, главным образом благодаря переполнению стека.

Мои вопросы:

  1. Имеет ли вещательный приемник возможность чтения из базы данных при запуске при загрузке (учитывая, что само приложение не запущено)?

  2. Предполагая, что это возможно, и после запроса к базе данных я получаю информацию об уведомлении, я полагаю, что мне нужно настроить новый 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 при перезагрузке.

Большое спасибо, Алекс

...